The 3D object detection challenge evaluates the performance on 10 classes: cars, trucks, buses, trailers, construction vehicles, pedestrians, motorcycles, bicycles, traffic cones and barriers
대규모 ML 개발 조직에서는 데이터 조직, 모델 개발 조직, 모델 엔지니어링 조직, 솔루션 개발 조직, 운영 조직이 다 다르다.
모델이 수시로 업데이트 되고 개발 버전이 달라서 feature 명세를 별도로 저장해놓고 feature store의 명세를 기준으로 소통, 버전 관리를 한다.
데이터, feature를 feature store에 저장해 놓고 데이터 분석, 모델 학습/시험, 서빙, 모니터링 함. 데이터 들어오면 실시간 feuture 자동 변환 가능. feature 필요 시(학습) 만들 필요 없이 저장된 것 사용. feature 규격 표준화로 관리가 편함. feature 모니터링 가능함
feature store 저장 항목
feature 명세: feature 정의, 계산 로직, 소유자, 날짜, 변경 이력 등
데이터 셋
feature 명세로 가공한 feature 셋
feature store 사용 안 하면,
feature 버전 달라짐 - 학습 모델의 feature != 서빙 모델의 feature
성능 떨어지는데 원인 파악 어려움
동일 feature 명세에 대해 조직별로 데이터 셋 중복 제작, 관리함
필요할 때 마다 feature 만들어야 함.
feature store 적용 사례
Salesforce: feature store의 feature 사용
feature store 오픈 소스
feature store 적용 전후
전
후
feature store와 상관 없는 작업
작업 흐름 관리
데이터 웨어하우스, 데이터 레이크
데이터 탐색 시스템
파이프라인 생성
feature 엔지니어링 툴
데이터 버전 관리
모델 제공 메타데이터 관리
팀 협업 활
버그 수정 데이터셋
github 이슈와 수정한 내역(PR, Pull Request)을 반영해서 버그 수정 능력 학습을 위한 데이터셋
데이터 정제 (Cleaning)
품질 필터링(저품질, 가짜 뉴스 제거), 중복 제거, 언밸런스 완화(소수 클래스 오버 샘플,
판다스 코딩
데이터에서 평균을 빼고 분산으로 나누면 평균은 0, 범위는 [-1, 1]로 정규화 된다.
분산 정규화
Standardization(표준화)
평균 0, 분산 1 로 변환, 값 범위는 보통 -3 ~ +3
가우시안 분포일 때 적합. 이상치 영향 받
Normalization(정규화)
최대, 최소 값의 범위를 0~1 (또는 -1 ~ 1) 로 변환
이상치가 있으면 데이터가 0이나 1에 몰릴 수 있음
텍스트 데이터 정제
컴퓨터가 알아볼 수 있게 변경
텍스트 정제
대소문자 통일
문장 부호, 특수 문자, 숫자, 공백, 개행문자('\n') 제거
단어별 품사 분석
불용어 제거 (the, is, and, 그리고, 그, 은/는/이/가 등)
토큰화
어절 단위, 형태소 단위로 나눔
n-gram: 한 번에 사용할 토큰 수
1-gram: I, love, you
2-gram: I love, love you
3-gram: I love you
예
어근 동일화
어간 추출
단어에서 어미를 뺀 부분
먹이다: 먹이(어간) + 다(어미)
studying: study(어간) + ing(어미)
love, loving: lov(어간) + ing(어미)
표제어 추출
단어 기본 형태
먹는다, 먹었다, 먹어라 -> 표제어: 먹다
품사 분석
명사, 동사, 부사, 감탄사 등
영어: 브라운 말뭉치 사용
한국어: 국립국어원 말뭉치 사
데이터 증강 (Augmentation, Sampling)
증강 방법
회전, 좌우 반전, 상하 반전, crop 하기, crop 지우기, 크기 변경, 색상/밝기 변경, crop한 것 붙이기, 겹치기
ε (엡실론): Epsilon Greedy: 활용(Exploitation, 현재까지의 최고 행동)과 탐험(Exploration, 새로운 행동)의 비율 조정.
ε = 0.1 (10%) 이면, 합리적 행동할 확률 90%, 무작위 행동할 확률 10%
V_π (s) : 상태 가치 함수(State-Value Function). 정책 π일 때 상태 s에서의 기대 가치.
V_π (s) = E[ G(t) | S(t)=s]
Q_π (s, a): 행동 가치 함수(Action-Value Function). 정책 π일 때 상태s에서 행동 a를 할 때의 기대 가치
Q_π (s, a) = E[ G(t) | S(t)=s, A(t)=a ]
V *(s) : 최적 정책 π일 때의 상태 가치 함수
Q* (s, a) : 최적 정책 π일 때의 행동 가치 함수
V *(s) = max_a Q* (s, a) : 최고의 상태 가치는 최고의 행동을 할 때의 행동가치라고 할 수 있다.
a* = arg max_a Q* (s, a) : 최고의 행동은 행동 가치 함수Q를 극대화 하는 행동
과제
상태(s)와 정책(π)에서 기대 누적 보상(V) 도출 방법 정의
상태(s)와 정책(π)에서 특정 행동(a)을 했을 때의 기대 누적 보상(Q) 도출 방법 정의
Markov Process
현재 상태 정보로 미래를 예측. 상태 집합과 각 상태에서 다른 상태로의 전이 확률을 갖고 있음.
-> Markov Chain
Markov Process가 상태가 연속적 전이하는 관계로 표현한 것.
-> MRP (Markov Reward Process)
Markov Chain에 보상(reward)을 추가한 것
-> MDP (Markov Decision Process)
MRP에 의사결정(행동 a, 행동 결정 정책 π)을 추가한 것
주요 요소
V: 상태 s, 정책 π 일 때 기대 누적 보상
Q: 상태 s, 정책 π 일 때 행동 a를 하는 경우 기대 누적 보상. a의 적절성 판단에 사용
목표: 최적의 정책을 찾는 것
환경이 어떻게 동작하는지 환경 모델을 알고 있다면 'Planning' 방법을 통해 정책 도출 가능.
환경 모델을 모른다면 시행착오(행동과 결과를 보는 과정을 반복)를 통해서 최적 정책을 찾을 수 밖에 없다. 즉, 행동 가치 함수로 정책을 학습해 간다.
행동 가치 함수 예: MC(Monte Carlo) Method, SARSA, Q-Learning, Policy Gradient 등
On-Policy
현재 정책에 따라 행동 하면서 그 결과를 바탕으로 학습함
경험 만드는 정책과 경험을 반영해서 업데이트 하는 정책이 동일함
Off-Policy
다른 정책, 과거의 정책 등이 만든 Replay Buffer에서 데이터를 샘플링 해서 현재 정책을 업데이트 함.
경험 만드는 정책과 경험을 반영해서 업데이트 하는 정책이 다름
ε-Greedy
전에 안 해본 새로운 시도를 하게 하는 확률
보통 ε는 10%
초기에는 ε를 크게하고 후반부에는 1%로 줄여서 수렴하게 함
V 계산 방법
Monte Carlo
환경 모델 모름
경로(에피소드)를 샘플링 해서 끝까지 가서 보상 확인하고 나서 V 도출함
단점: 경로가 유한해야 함.
Dynamic Programming
환경 모델 안다.
그래서 그냥 각 경로를 끝까지 안 가고 한 스텝만 가도 바로 V 도출함
Temporal Difference
환경 모델 모르는데도 한 스텝 마다 V 예측치 도출한다.
Monte Carlo의 G_t 를 (다음 단계에서의 보상과 그 이후 보상의 예측치)로 변경한 것임.
Bellman Equation
V, Q를 재귀적인 형태로 표현한 것이 Bellman Equation임.
Temporal Difference는 Bellman Equation에서 재귀 뒷 부분을 예측값으로 넣어서 푸는 것임.
DP 처럼 경로 무한해도 적용 가능
SARSA
Temporal Difference는 V를 구하는 것임.
이 방식 데로 Q를 구하는 방식이 SARSA임
메타 강화 학습 (Meta-Reinforcement Learning)
빠른 학습 방법을 찾는 학습 법
Meta Training
다양한 과제에서 에이전트 학습시킨 후 에이전트의 학습 방법(업데이트 규칙, 파라미터 초기화 방법, 메모리 관리 방법 등)을 학습한다.
Meta Test
새로운 과제에 학습한 데로 알고리즘을 세팅해서 빠르게 학습한다.
모방 학습 (Imitation Learning)
전문가의 시연을 에이전트가 따라하면서 학습한다. 메타 학습을 적용해서 전문가 시도 횟수를 줄인다.
One-shot / Few-shot Imitation Learning
Domain Randomization
현실에서, 실제 데이터로 강화 학습하는 것은 어렵다. 그래서 시뮬레이션을 만들어서 가상 데이터로 강화 학습한다.
응용 사례
알파고(DeepMind)
알고리즘
Value Neotwork + Polcy Networks
OpenAI Five(OpenAI)
Dota2 게임을 인간 상대로 이김
알고리즘
Proximal Policy Optimization(PPO)
Robot Control(OpenAI)
로봇 손을 제어해서 큐브를 맞추기
알고리즘
Proximal Policy Optimization(PPO)
Data Center Cooling(DeepMind)
데이터 센터 쿨링 최적화. 40% 비용 절감
알고리즘
Reinforcement Learning
영화 추천(Netflix)
알고리즘
Reinforcement Learning
Trading(JP Morgan)
알고리즘
Reinforcement Learning
앙상블
종류
투표
동일한 데이터로 학습한 모델 여러 개의 결과의 평균 값이나 최빈값을 출력
배깅
각자의 데이터로 학습한 모델 여러 개의 평균이나 최빈값으로 출력
부스팅
모델을 순차적으로 학습함. 앞 모델이 틀린 데이터에 가중치를 높여서 학습 함.
추론 때는 모든 모델의 결과 값의 평균이나 최빈값을 출력함.
맨 마지막 모델이 가장 나아 보이지만 어차피 약한 모델들이라 맨 마지막 모델도 하나로는 성능 안나옴.
스태킹
2단계로 학습, 추론함. 앙상블 방법 중 성능 좋음
1단계
모델 별로 다른 알고리즘으로 학습/추론(SVM, Tree, NN 등)
2단계(메타 모델)
1단계의 결과를 입력으로 받아서 모델 1개가 학습/추론.
회귀 또는 분류 모델 사용
배깅 알고리즘
랜덤 포레스트 앙상블
트리 여러 개 사용.
정확도 높고 과적합 없음.
부스팅
Gradient Boosting Machine(GBM)
단계 마다 이전 단계의 모델을 보완하는 새로운 모델을 추가함. 전체적인 분류를 세분화하는 효과.
XGBoost (eXtream Gradient Boosting)
GBM을 개선
정규화 추가, 병렬 처리, 누락 데이터 처리기 내장, 분할 종료 방법 개선
LightGBM
XGBoost와 같은데 트리를 추가 할 때 전체적인 분류를 세분화하는 관점 보다는, 오차가 큰 부분을 집중적으로 세분화 하도록 트리를 추가함.
딥러닝
Unsupervised Learning
볼츠만 머신(Bolzmann Machine)
정답 데이터의 분포 데로 출력하는 모델을 만든다.
fully connected 된 노드 중 일부는 visible 노드, 나머지는 은닉 노드로 설정.
visible 노드는 모두 입력/출력으로 만들 수도있고, 입력노드 출력 노드를 정해놓을 수도 있다.
은닉노드를 학습시켜서 입력 여부 상관없이 출력 노드로 원래 분포와 비슷하게 출력이 되기만 하면 됨
제한된 볼츠만 머신 (RBM, Restrected Bolzmann Machine)
2layer 구조로 만들어서 연결 구조를 단순화 함
오토 인코더
입력값을 가장 잘 나타내는 임베딩 Z를 만드는 인코더를 만드는 것이 목적임. 임베딩 Z가 잘 만들어졌는지 확인하고 인코더를 학습하기 위해 디코더 사용함.
stacked autoencoder
오토 인코더 여러개를 학습시킨 후 은닉층을 이어 붙여서 크기를 키우고 fine-tuning으로 완성함
스파스 오토인코더(sparse autoencoder)
오토인코더에서 임베딩 z 레이어에 가끔 씩 활성화되는 노드를 추가함. 가끔 씩 활성화되는 노드의 활성화율이 0이면 오토인코더와 동일한데 가끔 씩 활성화 되어서 약간 보조 해주는 것임. 보통은 노드 값이 0이라 원핫임베딩처럼 스파스함.
디노이징 오토인코더(Denoising Autoencoder)
입력값이 노이즈 추가해서 노이즈에 강한 인코더를 만듦
VAE
Semi-supervised Learning
일부 라벨된 데이터, 다수 라벨 없는 데이터 학습
라벨 데이터로 학습 -> 라벨 없는 데이터 라벨링, 이 데이터 포함해서 재학습
Unsupervised Reinforcement Learning
대조학습
표현학습(Representation Learning)의 하나
기준 샘플(anchor)를 뽑고 이와 동일 클래스 샘플과 다른 클래스 샘플을 뽑음. 기준 샘플과 동일 클래스 끼리의 거리는 좁히고, 기준 샘플과 다른 클래스 샘플 간 거리는 늘어나도록 학습함.
CURL(Contastive Unsupervised Representatiions for Reinforcement Learning)
이미지 입력 RL은 보통 CNN + RL 이며 학습이 느리고 불안정함
CURL은 CNN의 결과인 임베딩을 더 잘 뽑아서 RL성능을 높이는 방법임.
임베딩 품질 개선을 위해서 대조학습을 함. 어떤 상태의 이미지를 기준이미지(anchor)로 잡고 이 이미지를 증강한 이미지를 Positive 이미지로 정한다. 그리고 다른 상태의 이미지를 Negative 이미지로 해서 대조학습을 한다.
임베딩이 개선되었으니 RL 학습이 빨라지고 성능 올라간다.
학습 이론
활성 함수
시그모이드
확률 해석 가능
그래디언트 바니시 문제 발생. 극단으로 가면 기울기가 0이 되기 때문.
non zero-centerd: 값이 0~1 이라 항상 양수임. 입력 x에 따라 -, + 모두 될 수 있지만, x의 부호가 균형잡혀 있는 것이 아니기 때문에 모델에 반영되는 기울기의 평균이 0이 아닌 한쪽에 치우치게 됨. 불균형적으로 업데이트 됨.
배치 정규화
평균을 0, 분산을 1로 만들어서 학습 편향성 없앰
역전파시에도 기울기를 0이 아닌 어느 정도의 값으로 유지시켜 줌. 그레디언트 바니쉬 문제 예방
Tanh
시그모이드의 non-zero centered해결 하기위해 사용.
평균이 0임.
그래디언트 베니싱 문제 여전히 있음. 극단으로 가면 기울기가 0이 되므로.
ReLU
그레디언트 배니싱 문제 개선. 양수면 극단으로 가도 기울기 유지됨. 음수면 여전히 기울기 0.
Leaky ReLU
그레디언트 배니싱 문제 해결. 음수일 때도 기울기 값 가짐.
softmax
fully connected layer에서 사용
전체 클래스에서의 확률의 합이 1. 가장 확률 높은 것을 최종 클래스로 선택함.
학습
순방향(Forward): 예측 값과 손실 계산
역방향(Backward): 기울기(Gradient) 계산
최적화(Optimizer): 기울기*학습률 만큼 가중치를 업데이트함
Vanishing(베니싱)
역전파 때 기울기를 구해서 반영함.
해당 층의 기울기 = 바로 전 층 기울기 X 그전 층 기울기 X 그 전전층 기울기 X ....
층이 깊어지면 해당층의 기울기는 0이 되어서 학습이 안됨.
해결 방안: Leaky ReLU, He 초기화, 배치 정규화
He 초기화: ReLU 사용시 모델(W)의 초기화 방법. ReLU 계열에서 Vanishing 이 줄어들도록 분산을 2배가 되도록 초기화 함.
발산(Exploding)
해결 방안
Gradient Clipping
기울기의 최대값을 지정해둠. 기울기가 너무 커져도 최대값으로 한정되어서 발산 안됨.
배치 정규화(Batch Normalization)
배치 졍규화 레이어 마다 배치 단위로 임베딩 범위를 정규화 함.
임베딩(x) 평균이 0, 분산이 1이 되록 정규화 함
정규화 한 임베딩(x)에 스케일과 시프트를 반영해서 조정한다.
배치 정규화 활용 예
레이어 마다 분포가 편향되는 것을 바로 잡아줌
ReLU인 경우 ReLU 후에 배치 정규화 하면 너무 많이 잘려서 분포가 왜곡됨. 배치 정규화 한 다음 ReLU하면 덜 잘려서 균형잡힌 활성화 가능함. 학습 안정성과 속도 모두 개선됨.
Optimizer
SGD (Stochastic Gradient Descent)
GD 처럼 전부 다 보려면 시간 걸리니까 전체의 무작위 샘플이나 미니 배치만 보고 가중치 업데이트
장점
수렴 빠름
계산 비용 적고, 메모리 적게 사용
단점
수렴 과정에서 진동 발생
하이퍼파라미터에 따라 편차 큼
불안정한 최종 수렴(진동이 커서) -> 학습률 점진적 감소로 해결
로컬 미니멈을 잘 못 빠져나옴
mini batch SGD
조금만 대신에 미니 배치 만큼은 보고 결정하자. 절충형
Momentum
물리 관성 적용: 이전 업데이트 값 90% + 이번 업데이트값 10% 으로 업데이트
장점
학습 속도 높음
흔들림 적음
노이즈에 강함
로컬 미니멈 빠져 나올 수 있음
단점
글로벌 미니멈도 빠져 나올 수 있음
NAG (Mesterov Acclearted Gradient)
Momentum과 같은데 이번 업데이트 값을 현재 위치가 아니라 이전 업데이트값으로 90% 업데이트 한 위치에서 업데이트 값을 구해서 10%를 반영한다.
장점
Momentum에 비해 더 빠르고 안정적으로 수렴. overshooting 방지
단점
계산 복잡
하이퍼 파라미터에 민감(발산하거나 수렴 느릴 수 있음)
AdaGrad
처음에는 크게 가다가 갈수록 작게 학습
t가 커질 수록 G_t 가 무한대가 되어서 학습률이 0이 됨
RMSProp (Root Mean Square Propagation)
AdaGrad 개선
학습률의 분모가 무한대가 되지는 않아서 학습률이 0이 되지는 않는다.
최근 기울기가 크면 이번 학습률은 작게하고 최근 기울기가 작으면 학습률이 커져서 충분히 학습하게 한다. 이렇게 너무 많이 가지도 너무 멈춰 있지도 않게 조절함.
Adam (Adaptive Moment Estimation)
RMSProp와 Momentum의 장점을 섞음.
방향과 스텝 크기 모두 적절히 조정
빠르고 안정적으로 수렴함.
Nadam (Nesterov-accelerated Adaptive Moment Estimation)
Adam 에서 Momentum 대신 NAG 사용
좀 더 빠르고 안정적 수렴
LLM
이론
순서: 아케텍터 선정 - 데이터 준비 - 토크나이징 - pre-training - fine-tuning, instruction tuning - alignment - 디코팅, 압축, 최적화
Positional Encoding
절대 위치 임베딩(APE, Absolute Positional Embeddings)
절대 위치 사인, 코사인 학습
토큰 개수 한정
원조 Transformer에서 사용
상대 위치 임베딩(RPE, Relative Positional Embeddings)
상대 거리 행렬 삽입
T5 변종에서 사용
회전 위치 임베딩(RoPE, Rotary Posiion Embeddings)
Q, K 벡터를 회전 행렬로 일정한 각도로 회전 시킴. 그래서 상대적 거리 정보를 반영하게 됨.
GPT, PaLM, LLaMA에서 사용
Pre-training
Autorgressive Language Modeling
다음 토큰 예측 위한 Log-likelihood 최대화
GPT 류에 사용
Masked Language Modeling
입력 일부를 Mask로 가리고 복원
BERT류
MoE & Switch Transformer
FFN을 다수 전문가로 분할해 계산량을 아끼면서 파라미터를 테라급까지 늘림
Fine-tuing, Instruction Tuning
SFT(Supervised Fine Tuning)
테스크별 소량 라벨로 성능 향상
Instruction Tuning
자연어 지침+예시 데이터(Natural Intructions등)로 범용 '지시 수행' 능력 부여
Self-Instruct
모델이 스스로 지시, 정답 쌍을 생성해 부트 스트랩 학습
조정
RLHFreinforcement learning from human feedback)
인간 피드백으로 보상 모델을 학습해서 정책을 강화
RLAIF(reinforcement learning from AI feedback)
상위 LLM으로부터 자동 피드백을 받아 미니, 중형 모델을 튜닝
DPO(Direct Preference Optimization)
사람이 선호한 응답의 확률을 기준 모델 대비 더 높이고, 덜 선호한 응답의 확률은 더 낮추도록 직접 최적화.
사람이 만든 모델 결과의 피드백(OK, NOK)으로 추가 학습함. SFT(Supervised Fine-Tuning) 학습과 다르다. SFT는 OK, NOK 각각에 가중치 조정한다. DPO에서는 OK 데이터, NOK 데이터를 동시에 받아서 OK 데이터에서의 확률과 NOK 데이터에서의 확률의 차이의 비율 만큼 가중치를 조정한다.
원래 잘 하는 것을 유지하면서 OK 응답의 확률은 올리고 NOK 응답은 낮추는 안전하고 정교한 최적화다.
그래서 SFT는 학습이 과하면 편향 될 수 있지만, DPO는 분포 안정적 유지 됨.
KTO(Kahneman-Tversky Optimization)
Prospect Theory에 기반해 '바람직, 비바람직' 1-bit 신호만으로 정렬
대량 데이터 활용이 용이
디코딩 전략: 다음 토큰을 선택하는 전략
Greedy Search
가장 확률이 높은 토큰만 선택
속도 빠름
시퀀스에 미치는 영향은 고려 안함
Beam Search
N개 후보 확장 후 최고 득점 시퀀스 선택
Top-K Sampling
상위 k개에서 토큰 1개 선택
Top-p Sampling
누적 확률 p가 될 때까지 k개 선택. 그 중에서 1개 선택
비용 효율적인 훈련/추론/적용/압축
ZeRO (Zero Redundancy Optimizer)
대규모 분산 학습용 메모리 최적화 방법
모델과 파라미터값들을 쪼개서 각 GPU에서 연산한 다음 각 shard를 모아서 하나로 합침.
RWKV (Receptance Weighted Key Value)
RNN 재해석으로 훈련은 Transformer 식 병렬화, 추론은 선형 복잡도
긴 컨텍스트, 저지연 추론 가능
LoRA(Low-Rank Adaption)
저랭크 행렬 A, B 만 학습해 W 추정 -> 메모리, 파라미터 절감
경량 파인튜닝, 모델 공유용이
Knowledge Distillation
대형 teachrer출력을 student가 모방 학습
엣지 배포용 소형-고성능 모델 학습
Quantization
가중치 정밀도 FP32->INT8/INT4, QAT 또는 PTQ
모델 크기 작고 추론 속도 빨라짐
LLM 제한 사항
무상태, 확률성
앞 대화를 기억하지 못하고, 동일 프롬프트에도 출력이 달라질 수 있다.
지식 고정, 외부 정보 미 접근
훈련 시점 이후의 사실, 사적, 도메인 지식에 접근 불가
비용, 지연, 할루시네이션
거대 파라미터, GPU 비용, 사실과 무관한 '그럴듯한' 문장 생성 문제
할루시네이션은 Intrinsic vs Extrinsic으로 구분되고, ROUGE, BLEU, PARENT, FactScore 등 통계, 모델 기반, 인간 평가가 병행된다.
내재적 환각
원본 자료와 직접적으로 충돌하여 사실적 부정확성이나 논리적 불일치
외부 환각
모순되지는 않지만 출처에 대해 검증할 수 없으며 추측적이거나 확인할 수 없는 요소를 포함
LLM 설계와 엔지니어링
CoT(Chain-of Thought)
LLM은 예측 모델, 추론에 맞지 않음. 수학, 단어, 상식 추론 등 다단계 추론 어려움. 그래서 추론 과정을 제시해주고 따라서 하도록 함
예제 문제/풀이/답을 제시하고 문제 내면 풀이/답을 따라서 추론하고서 풀어감
제로샷 CoT
추론 과정을 제시하지 않고 '단계 별로 나누어서 추론해보자'라고 언급하면 LLM이 단계별로 나누어서 추론함
수동 CoT
사람이 세부 단계를 하나씩 써 주는 것
ToT(Tree-of-Thought)
CoT는 1개 논리 흐름이라 잘 못 하면 틀린 결론에 도달.
ToT는 다양한 선택지를 트리로 하나 씩 체크
분기 탐색 + 평가로 다양한 가설 탐색
불확실, 복잡한 문제에 강점
Self-Consistency(자기 일관성)
CoT 여러 번 돌려서 답변 여러개 얻음. 공통 결과를 최종 출력
Reflection
모델이 자체 답변을 검토, 수정해서 출력
Expert Prompting
여러 전문가 답변 종합해서 출력
Chains & Rains
Chain: 워크 플로우 명시(프롬프트 생성 → 모델 호출 → 후처리 → 응답 반환)
Rains: 벗어 나면 안되는 규칙 설정(Guardrails)
APE(Automatic Prompt Engineering)
LLM 이 프롬프트 생성, 프롬프트 검토, 프롬프트 수정해서 프롬프트를 완성해감.
프롬프트 자동 최적화
Transformer 이전(2012~2017)
이미지
AlexNet (2012)
CNN 기반 이미지 인식 시작을 알림, ILSVRC 2012에서 우승
5개의 CNN 계층, 3개의 fully connected 계층으로 구성
이미지 특징 추출 위해 여러 컨볼루션 커널 사용
정규화, dropout 사용
ReLU 사용
RNN (1990)
순환 구조 도입으로 순차 데이터 처리 가능
장점
시계열 데이터 패턴 학습
가변 데이터 처리 가능
단점
10 step이 max. 장기 의존성 처리 어려움. 데이터 길어지면 기울기 소실이나 기울기 폭발 생김
가장 마지막 것을 가장 중요하게 처리. 의미상 중요도 반영 안함.
순차적 처리로 느림
구조
many to one
one to many
many to many
loss: 각 y_i 마다의 합
input 결과를 모두 하나로 모은 다음 output을 만들어 낸다. 시계열 인코더-디코더 구조
LSTM (Long Short-Term Memory)
RNN의 Vanishing Gradient 문제 해결 (RNN 10스텝을 넘어서 수천 스텝 가능)
셀 상태, 망각/입력/출력 게이트를 두어서 정보를 선택적으로 제어함
구조 비교
RNN
LSTM
게이트 구조
Sigmod Layer : 정보 반영 비중 조절.
0: X , 1: 전부
쉘 상태 정보
과거 정보 C_(t-1)를 f_t 비중만큼 통과 + 현재 정보 C_t 는 i_t 비중만큼 통과 = 현재 출력 정보 C_t
망각 게이트
과거 정보 h_(t-1)와 현재 입력 정보 x_t를 합쳐서 과거 정보 반영 비중 도출. 차단 or 통과
입력 게이트
현재 정보 C_t의 비중을 적용
출력 게이트(Output Gate)
O_t: C_t를 tanh해서 -1~1 로 정규화 한 다음 비중인 o_t와 곱해서 해당 정보만 h_t로 출력
GRU (2014)
LSTM 구조 간소화 하고 성능은 유지
LSTM의 3개 파트를 Reset Gate, Update Gate로 구성
LSTM의 셀 상태 C_t와 결과값 h_t 를 GRU는 h_t로 통합
Reset Gate
기존 h_(t-1)의 정보를 통과 or 차단
Update Gate
이전 step의 결과 차단(z:0 )/통과(z: 1)와 현재 step의 결과를 섞어서 현재 step의 최종 결과 h_t 출력
전제 구조
VAE (2013)
확률적 생성 모델. 입력 데이터를 latent space로 인코딩하고 이것을 입력과 유사하지만 다른 데이터를 생성
AE 는 입력을 가장 잘 나타내는 latent embedding을 얻는 것이 목적. 이를 확인하기 위해 디코더를 이용
VAE는 입력과 유사한 데이터를 잘 생성하는 디코더를 얻는 것이 목적. 이를 위해 인코더를 사용
AE는 특정 입력 값에 하나의 Z가 나옴
VAE는 특정 입력 값에 가우시안 분포로 Z가 나옴. 그래서 입력과 비슷하지만 다른 출력이 나옴
ResNet (2015)
2014년 22층에서 152층으로 크게 깊어짐
Residual Learning으로 깊어져도 성능 저하 방지
VGG 보다 성능 우수
그냥 레이어 수를 늘리면 성능이 더 떨어진다.
Residual Block으로 만들면 미분을 해도 최소 1이어서 Gradient Vanishing 문제가 생기지 않음.
Bottleneck Design: Residual Block 계산량 줄이기 위해서 1x1 convolution 을 넣는다.
identity block
convolution block
x에 1x1 conv 연산 후 F(x)에 더해줌
radisual 구조와 시험 결과
아래 그림에서 실선은 identity block, 점선은 convloution block
residual 있는 것이 없는 것보다 에러율이 더 낮다.
152 layer가 가장 성능이 좋다.
언어
Seq2Seq (2014)
최초의 기계 번역 모델
Seq2Seq with Attention (2014)
Encoder의 모든 hidden state h에 가중치 a를 반영한 c_i를 만들고
Deocder에서는 기존 상태값과 이번 c_i 를 합쳐서 현재 상태 s_i를 만들고 s_i로 현재 단어를 출력한다.
Encoder에서 모든 입력 단어에 대해서 가중치 a를 반영하기 때문에 attention이라 부른다.
Transformer의 등장 (2017~2019)
Transformer (2017, Google) - Self-Attention을 이용해 기존 RNN보다 병렬 연산 가능
BERT는 일반적인 self-attention이고 GPT-2는 masked self-attention임
Self Attention 이란?
self-attention은 입력 데이터 내의 단어들 간의 관계를 반영하는 것.
입력 데이터 내의 각 단어를 'Query'와 'Key'로 간주하고, 각 'Query'에 대해 각 'Key'와의 관계를 'Value' 값으로 도출. 아래 예에서 Query 'it'은 Value 'animal'과 관련이 높은 Value 값을 가짐을 도출
Query에 대한 Key, Value 를 간략한 수식으로 표현할 수 있다.
V=X * W_V. t시간 이전에 입력된 key 별 상태 s에 방금입력된 q를 곱하고 전에 비중을 반영해서 key별 a를 구한다. 그래서 각 key에 해당하는 value에 해당 가중치인 a를 곱한다. 그러면 해당 key 별 중요도 반영한 v이고 이걸 합하면 q에 대한 attention이된다. 여태까지 중에 중요한 단어인지 아닌지.
이 q와 a를 반영하면 q에 대한 출력 임베딩(z)가 된다.
basic self-attentin
각 단어에 대해서 다른 모든 단어와의 attention score(관련도 점수)를 구하고 각 단어와 곱합 합이 해당 단어에 대한 출력이다.
예를 들어, x_1은 movie, x_2는 user, x_3는 area, x_4는 age 라 할 때
user에 대한 결과 값 = (user와 movie의 연관 점수) X movie + (user와 user의 연관 점수) X user + (user와 area의 연관 점수) X area + (user와 age의 연관 점수) X age
위 예에서 Query, Key, Value를 적용해보면
여기서 user가 Query, x_1 ~ x_4 가 Key, user에 대한 결과 값이 Value 이다.
즉, 알고자 하는 입력값이 Query, 관련 되는 모든 값들이 Index라 각각에 대해서 다 훝어 보고 결과 값이 Value.
알고 싶은 단어 Query를 사전 index(Key) 전체를 훝어보면서 찾은 후 해당 페이지에 나와 있는 설명(결과 값)이 Value임.
self-attention으로 W를 적용해서 Query, Key, Value를 정확하게 다시 표현하면 아래와 같다. x2가 Q, x3가 key, value
Query, Key, Value란?
Query: 입력 토큰, Key: 콘텐트 인덱스, Value: 각 콘텐트들의 내용
Query: "입력 토큰" 과 관련 있는 다른 단어는?
Key: "인덱스"에 따라서 후보 토큰들을 죽 나열함
Value: 입력 토큰에 관련이 높다고 판단된 "토큰 선정 결과"
Q, K, V 각각의 크기는 B(배치 크기(txt 개수, 이미지 개수)) X L(길이, txt의 토큰 수, 이미지 패치 수) X d(임베딩 차원, 토큰 1개나 이미지 패치 1개의 임베딩의 크기). 즉, d 차원짜리 임베딩 몇 개로 구성된 데이터가 몇 개인지가 Q, K, V의 크기임.
X는 입력 데이터 1개(입력 txt 1개, 입력 이미지 1장)의 임베딩. n은 데이터 1개의 토큰의 개수(또는 이미지 패치의 개수)
적절한 Key를 찾기 위해 Query와 Key간의 코사인 유사도(cosine similarity, -1 ~ +1)를 구한다.
Query, Key, Value 모두에 input embedding과 positional encoding을 합한 embedding을 입력함. 동일한 값이 입력됨.
'Hi, How are you?'입력 받으면 'I am fine.'을 출력하는 예를 보자.
'Hi, How are you?'를 input embedding으로 만들고 positional encoding을 더해서 positional-aware embedding을 만든 후 트랜스포머의 linear layer에 넣음. positional-aware embedding은 6X5 크기.
Linear layer는 6X3크기. positional-aware embedding과 linear layer를 곱하면 6X3이 됨. Query, Key, Value모두 이 작업으로 6X3이 됨.
Multi-Head Attention이란?
Multi-head attention은 attention을 여러 가지로 적용한 것임. self-attention은 하나는 하나의 관점에서 중요도를 판별하므로 다양한 관점을 가진 여러 attention을 적용하여 더 풍부하고 다차원적인 데이터 표현을 얻는다.
각 attention은 각자의 attention filter를 만들어 낸다. Value가 이 필터들을 통과 하면 필터링된 Value 들이 생긴다. 이 value 행렬을 concatenate해서 linear layer에 통과 시켜서 원하는 출력 크기로 맞춘다.
attention 행렬을 attention head라 부른다. 여러 attention head를 사용해서 병렬로 사용하면 다른 시각으로 정보들을 수집할 수 있다.
그래서 입력 토큰 셋에 대해서 query 셋, key 셋, value 셋으로 self-attention하는 것을 여러 개 한 것이 multi-head attention임
각 attention에서의 결과를 concat한다.
Q, K, V마다의 W가 다양한 버전으로 준비되어 있다. Q, K, V와 W가 곱한 것이 attention head이고 W가 다양하게 여러 개라 여러 가지의 attention head가 나와서 multi head adttention이라 부름. W는 W_k, W_v, W_q 각각 있음.
이 attention score를 root(d)로 나누어 scaling을 함. d는 Key의 dimension이므로 여기서는 6.
Mask
optional한 부분임. 입력 값이 word인지 아닌지 여부를 masking을 통해 구분함.
SoftMax
위 scale한 값을 softmax layer에 통과 시켜서 앞에서 구한 attention score를 0또는 1로 바꿈
위 그림에서 배경이 제거된 그림만 남기는 것 처럼 attention score를 Value와 내적하고나면 필요한 정보만 남기고 나머지는 제거된다.
Value와의 MatMul(Dot product)
seq2seq attention에서 F(encoder output)과 alpha vector를 내적해서 attention의 결과인 context vector로 사용하는 것 처럼, Transformer에서는 Value와 {Query와 Key로 만든 Attention Score}를 내적해서 Context Vector로 사용한다.
Self-Attention의 위 다섯 단계를 수식으로 나타내면
Posision-wise fully connected Feed-Foward NN
포지션-와이즈 FFNN은 인코더와 디코더에서 공통적으로 가지고 있다.
attention layer의 결과 값은 fully connected Feed-Foward network를 지나간다.
Feedforward network 연산 과정은 multi-head attention matrix인 x에 가중치인 W_1을 곱해서 F_1을 얻는다. 이것을 ReLU를 통과 시켜서 음수는 0으로 마스킹한다. 이것에 가중치 W_2를 곱해서 출력한다.
W_1, b_1, W_2, b_2는 하나의 encoder layer 내에서는 다른 문장, 다른 단어가 들어와도 동일한 값으로 사용한다. 하지만 encoder layer마다는 다른 값을 가진다.
Transformer에서는 인코더 내에서 Residual connection과 layer normalization을 한다.
잔차(Residual connection)은 아래 그림과 같다. Vision에서의 표현인 H(x) = x + F(x)를 여기서의 표현으로 바꾸면 x+Sublayer(x)로 표현한다.
residual connection을 거친 결과는 이어서 layer normalization을 한다.
layer normalization(NL으로 표기)은 아래와 같다.
NL = LayerNorm(x+Sublayer(x))
layer normalization은 텐서의 마지막 차원에 대해서 평균과 분산을 구하고, 이를 이용해서 정규화 해서 학습을 돕는다.
여기서 마지막 차원이란 d_model 차원이며 d_model 차원의 방향과 평균, 분산 구하는 형태는 아래 그림과 같다.
layer normalization은 평균과 분산을 통한 정규화 단계와 감마와 베타를 도입하는 단계로 구성된다.
평균과 분산을 통해 x_i를 정규화 한다.(엡실론은 분모가 0이 되지 않도록 하기 위한 아주 작은 값)
이제 γ(감마)와 β(베타)를 준비한다. 초기 값은 각각1과 0이다.
γ와 β를 도입한 layer normalization의 수식은 다음과 같으며, γ와 β는 학습 가능한 파라미터이다.
Cross-Attention(인코더에서 디코더로 전달)
디코더에서 인코더의 출력과 디코더의 입력 간의 상호 작용을 모델링. 복잡한 문장 구조를 이해하는데 역할. 서로 다른 컴포넌트 간의 정보 교환이라 '크로스 어텐션'이라 부름.
인코더에서 사용자 입력값에 해당하는 'I am a student'라는 문장의 출력 임베딩과 학습을 위한 정답인 '<SOS> Je suis etudiant'의 중간 임베딩을 같이 입력을 받아 학습을 한다.
encoder는 num_layers개수 만큼 있다. 순차적으로 num_layers만큼 연산한 후에 마지막 encoder의 출력을 decoder에게 전달한다. decoder도 num_layers개라 num_layers 만큼 연산을 하는데 이 때 마다 인코더가 보낸 출력을 매 decoder 연산 때 마다 사용한다.
디코더의 첫 번째 층: self-attention, Look ahead attention
디코더 역시 인코더와 동일하게 embedding에 positional encoding을 더한 문장 행렬이 입력됨. 그런데 transformer는 한번에 문장 전체를 입력 받으므로 예측해야 하는(현 시점보다 미래에 있는) 단어들은 학습할 때 참고하지 못하도록 look-ahead mask를 적용했다.
look ahead mask 는 첫 번째 서브층인 multi-head self-attention 층에서 이루어진다. attention scroe matrix에 masking을 적용해서 연산한다. 현재 자신 보다 미래에 있는 단어는 참고하지 못하도록 아래 그림과 같이 마스킹한다.
참고로 encoder의 sefl-attention, decder의 두번 째 sub layer의 encoder-decoder attention 에서와 마찬가지로 디코더의 첫 번째 층에서도 패딩 마스크를 적용한다. 여기서의 패딩 마스크는 look-ahead mask에서 패딩 마스크까지 포함해서 반영한다.
디코더의 두 번째 서브층: encoder-decoder attention
이전의 attention과 같이 multi-head attention이지만 self-attention은 아니다. self attention은 Query, Key, Value가 같은 경우를 말하는데 encoder-decoder attention은 Query가 decoder 행렬인 반면, Key와 Value는 encoder 행렬이기 때문이다.
인코더의 첫 번째 서브층: Query = Key = Value
디코더의 첫 번째 서브층: Query = Key = Value
디코더의 두 번째 서브층: Query: 디코더 행렬, Key = Value: 인코더 행렬
빨간 화살표 두 개는 각각 Key, Value이며, encoder의 마지막 층의 결과 행렬이다. 검은 입력 화살표인 Query는 디코더의 첫 번째 서브층의 결과 행렬이다.
transformer block
transformer block은 self-attention, layer normalization, feed forward layer(MLP), 또 다른 layer normalization, 그리고 residual connection(잔차연결)로 구성되어 있다
활용: 분류
활용: 텍스트 생성
언어
인코더 기반 - BERT와 변형모델(RoBERTa, ALBERT, DeBERTa, XLM, XLNet, UNILM)
BERT (2018, Bidirectional Encoder Representations from Transformers)
Pre-training 후 Fine Tuning 제시
양방향(Bidirectional)으로 파악하도록 self-attention을 설계. 그래서 bank가 강둑인지 은행인지 구분.
BERT 설명: BERT는 텍스트 인코더이다.
단어 의미에 맞는 임베딩을 만들고, 문장이 자연스러워 지는 문장 선후 관계 임베딩을 뽑는다.
문장 간 연속 여부 예측(NSP, Next Sentence Prediction)은 두 문장을 입력 받아서 다음에 오는 문장이 맞는지 여부 판단.
각 단어를 적합한 의미로 임베딩 하기 위해 단어 앞, 뒤 모두를 감안해서 임베딩을 만든다.
Masked Language Model: 단어를 마스킹한 후 마스킹 단어 앞 부분과 뒷 부분을 모두 참고해서 마스킹한 단어를 맞추는 학습을 함.
이를 통해 right가 '오른쪽'인지 '옳은'인지 분간해서 적합한 의미의 임베딩을 만든다.
왼쪽 부분만 보면 right는 '오른쪽'으로 해석되지만 양쪽을 모두 보면 '옳은'의미임을 알 수 있다. 기존 모델은 한쪽만 봤다. BERT는 양쪽을 보기 때문에 단어 의미에 맞게 임베딩을 만들 수 있다.
문장의 맥락과 선후관계를 감안해서 임베딩을 만든다.
Next Sentence Prediction: 모든 문장에 대해서 현재 문장의 다음에 오는 문장을 맞추는 학습을 함
BERT 임베딩 구조: 단어 임베딩 + 문장 순서 임베딩 + 단어 위치 임베딩
활용
활용 분야
문장 분류(단일 문장, 문장 셋의 종류 분류)
Question Answering
특정 문장 다음에 올 적합한 문장을 학습
개체명 인식(Named Entity Recognition, NER)
각 단어를 분류: ex. 이순신 -> 사람, 서울 -> 장소
output 쪽의 linear를 특정 작업에 대한 것으로 넣고 softmax 결과값으로 class 분류 가능.
모델 종류
BERT Base
transformer의 인코더 부분을 12개 쌓음
임베딩 벡터 크기: 768
BERT Large
transformer의 인코더 부분을 24개 쌓음
임베딩 벡터 크기: 1024
SpanBERT(2019)
BERT는 토큰 단위 마스킹해서 문맥 학습함.
SpanBERT는 스팬(연속 토큰)을 마스킹해서 학습. 길이가 다양한 연속 스팬을 마스킹.
토큰 인덱스: [0] 나는 [1] 학교에 [2] 간다
스팬(1–1): "학교에"
스팬(0–2): "나는 학교에 간다"
나머지 토큰화나 구조는 BERT와 동일
RoBERTa(2019)
BERT를 학습 엔지니어링 만으로 성능 향상 시킴
BERT 보다 큰 DB로 학습
BERT: 3.3B 단어, 16GB 텍스트. 백과사전·전문서적 중심
RoBERT: 10B 토큰, 160GB 텍스트. 뉴스·웹·스토리도 추
문장 간 연속 여부 예측(NSP, Next Sentence Prediction) 안 함
masked language model에 집중
BERT는 마스킹 패턴 고정. RoBERT는 매 에포크 마다 마스킹 위치 변경
더 다양한 문맥 예측 학습
활용
성능 큰 폭 향상
Hugging Face Transformers 라이브러리에서 공유해서 다양하게 활용(감정 분석, 문서 분류, QA, NER 등)
ALBERT (A Lite BERT, 2020)
BERT 모델 크기 줄이고 속도 개선
임베딩 행렬을 두개의 작은 행렬로 분할
BERT의 V x H 를 V x E + E x H 로 나눔. 모델 크기를 ~90% 축소
V는 단어(vocaburary), H는 Hidden representation이다. BERT는 학습 때 마다 V x H(=30000 x 768 = 약 2천만)를 연산하고 업데이트 한다. 대부분 0인 스파스 행렬이므로 V x E + E x H = 30000 x 128 + 128 x 768 = 약 400만으로 행렬 크기를 줄였다.
가중 공유로 GPU 메모리 절약
12층 트랜스포머 가중치를 다 같이 공유. Feed-forward 레이어, Self-attention, LayerNorm 등 모든 구성요소를 공유해서 가중치 1셋만 유지함.
문장 순서 예측 학습
문장 연속 여부 판단(NSP(Next Sentence Prediction)) 대신 문장 순서 예측(SOP, Sentense Order Prediction)하도록 학습
두 문장을 원래 순서, 바뀐 순서를 넣고 순를 맞히게 함. 문장간 관계를 이해함.
ELECTRA(2020, Efficiently Learning an Encoder that Classifies Token Replacements Accurately)
기존 BERT, SpanBERT, RoBERT, T5 모두 MLM(Masked Language Modeling) 즉, 마스킹 한 부분을 채우는 방법이다. 제대로 채우려면 내용도 같이 학습해야해서 상당한 양의 코퍼스가 필요하다.
ELECTRA는 작은 생성기가 마스킹된 단어를 적당한 다른 단어로 바꿔 놓고 모델은 단어 교체 여부를 판단하는 학습을 한다. 교체된 단어임을 판단하려다보니 일부 토큰이 아닌 입력 토큰 전체에 대해 맥락을 학습하게 된다. 그래서 결과적으로 단어 채우는 것은 쉬운 일이 되어서 기존 모델보다 더 성능이 좋다.
4일학습으로 GPT(30배 더 학습) 보다 우수하고, RoBERT, XLNet에 비해 1/4 연산만으로 성능 달성.
즉, 더 작은 모델, 적은 연산, 더 빠른 학습.
XLM
BERT: 단일 언어 pre-trained 모델
mBERT: 여러 언어를 독립적으로 학습.
XLM: TLM으로 언어간 의미 정렬을 강화
MLM (Masked Language Modeling) 학습 방법과 TLM (Translation Language Modeling) 학습 방법을 번갈아 가면서 학습함. MLM은 마스킹 한 단어를 맞추는 학습. TLM은 영어 문장, 동일한 의미의 프랑스어 문장을 이어 붙여서 입력하되 랜덤하게 마스킹 후 마스킹한 단어를 맞추는 학습. TLM에서 영어의 마스킹을 맞추기 위해 영어의 나머지 단어와 프랑스어 문장을 모두 살펴봄. 램덤 마스킹이라 영어 마스킹한 단어가 프랑스어 문장에서는 남아 있기 때문에 해당 단어를 참조할 수 있다. 그래서 MLM에서 영어 또는 프랑스어 문장의 나머지 부분에서 마스킹 단어 추론하는 훈련을 하고, TLM에서 언어간 문장 연관성, 단어 연관성을 학습함.
그래서 영어와 프랑스어 모두 동일의미의 단어는 비슷한 임베딩 공간에 위치하게됨.
UNILM(Unified pre-trained LM)
모델을 양방향, 단방향, 시퀀스-to-시퀀스 예측 방법으로 사전 학습. 그래서 NLU (Natural Language Understanding, 자연어 이해), NLG (Natural Language Generation, 자연어 생성) 모두 잘 함. 그래서 다양한 작업에 대응 가능함.
디코더 기반 - GPT
GPT (Generative Pre-trained Transformer)
핵심 아이디어
un-labeled data로 대규모 사전 학습 후 소규모 labeled data로 파인 튜닝하는 방법을 처음 제시
이전 LLM은 모델 규모 증가로 성능 향상시켜왔음. 학습 비요아 메모리, 탄소 발생이 기하급수적으로 증가하게됨
해결 방안
'모델 = 지식 저장소'라는 관행을 깨고, 필요할 때 외부 메모리(DB)에서 검색하여 훨씬 작은 모델로 기존 성능 달성
구조
오프라인: DB 구축
2조 토큰을 64 토큰씩자른 뒤 BERT 문장 임베딩을 키로 ANN 인덱스를 만듦
ANN 인덱스(Approximate Nearest-Neighbor Index)란?
고차원 벡터 공간에서 “가장 가까운 이웃(Nearest Neighbor)” 을 완벽히 찾을 때 드는 계산량을 줄이기 위해, “충분히 가까운(Approximate)” 후보를 빠르게 찾아 주도록 미리 구축해 두는 전용 자료구조·알고리즘
핵심 아이디어
1. 벡터 공간을 '거칠게' 잘라서 후보군을 좁힘
2. 후보군만 정밀 스코어링(Cosine, L2 등) 해서 Top-k 반환
3. '근사'라서 100% 정답은 아니지만 Recall(재현율)을 95~99%로 잡고 latency, 메모리, 비용으로 튜닝
ANN 인덱스 활용처
LLM + Retrieval : RETRO, RAG, A2A 검색
추천, 랭킹 : user-item 매칭, embedding-based search
멀티미디어 : 이미지/음원 유사 검색, CLIP 백터 탐색
바이오, 과학 - 단백질 구조 벡터, 대규모 시뮬레이션 특이점 탐색
보안, AIOps : 로그 임베딩 유사도 기반 이상 탐
온라인: 실시간 검색 & 생성
매 64 토큰 쿼리 청크마다 Top-k(기본 2개) 이웃과 그 다음 64 토큰을 가져와서 디코더가 cross attention으로 쓴다. 이중화된 ScaNN/FAISS 색인 구조와 배치 검색으로 1~2ms 내 생성함. 디스크 용량은 93 TB
성능
RAG 대비 차별점
GLam(Generalist language Model)
2021
1.2T 모델이지만 sparsely-activated MoE(Mixture-of-Experts) 구조 덕분에 토큰마다 단 8%(97B)만 계산함. 그래서 GPT-4(175B)보다 더 높은성능을 보이면서도 훈련 에어지 소비는 1/3, 추론 FLOP은 1/2 이하로 절감함
64개 전문가로 구성된 MoE 레이어를 구현
각 MoE 층(아래 블록 FFN)은 Transformer층(위 블록)과 교차로 배치되어 있다. 입력토큰(ex. 'roses')마다 Gating모듈이 64개 전문가 중에서 가장 관련성이 높은 두 전문가를 동적으로 선택하며, 이는 MoE 층의 파란색 격자로 표시된다. 선택된 두 전문가의 출력에 가중평균을 취한 결과가 상위 Transformer 층으로 전달된다. 입력 시퀀스의 다음 토큰에 대해서는 또 다른 전문가가 선택된다.
MoE(Mixture of Experts) 기술적 의의
조건부 계산
입력마다 일부 전문가만 활성화 -> 활성 파라미터 수가 계산량을 규정 -> 용량과 연산량 분리
토큰 수준 Top-2 Routing
토큰이 자신에게 가장 적합한 전문가 2개를 선택, 가중 합산하여 다음 레이어로 전달. 균형잡힌 부하 분산이 핵심
GShard-Switch Transformer와의 차이
GLaM은 더 깊은 MoE 적층과 노이즈-top-2를 선택해 품질, 로드밸러스 안정성을 모두 확보
깊은 MoE 적층이 주는 효과
모델 용량과 연산량 간 관련성 분리를 더 극적으로 달성(1.2T 모델에 연산은 8%만 활용)
매 층에서 전문가 조합 다양성이 누적되어서 언어, 도메인 다양성 대응력 향상
MoE 구조에서 토큰 분포 편향 때문에 일부 Expert는 폭주하고 나머지 Experts는 샘플이 부족해서 dead expert가 생기는 현상이 있다.
이를 방지하기위해 가우시안 노이즈를 추가해서 해당 Expert와 가우시안 확률로 다른 Expert가 선택되도록(해당 Experts또는 유사한 Expert일수록 높은 확률을 가지고 상관없는 Expert는 낮은 확률로 선택되도록)한다. 그래서 보다 (관련이 높은) 다양한 Expert들이 활용되도록 해서 각 토큰이 각 Experts에 고르게 가도록 한다.
이를 통해 GLaM은 전문가 사용 표준편차가 Switch 대비 40% 감소했고, 학습 불안정, 수렴 지연을 크게 줄였다.
장점
더 높은 정확도, 낮은 연산 비용
전문가 간 병렬성으로 TPU 클러스터 활용 효율 향상
스케일링 한계 돌파
이후 PaLM, Gemini 1.5, Mixtral 등 신형 MoE LLM 설계의 선구적 모델
70B 대화형 LLM, RLFH(인간 피드백 기반 강화 학습)에 규칙-조건 보상 모델과 증거 제시 기능을 추가.
안정성 높은 성능
UL2(Unifying Language Learning)
2022, Google Research
Mixture-of-Denoisers(MoD)를 제안
이후 U-PaLM에서 MoD 활용
BLOOM (BigScience Large Open-science Open-access Multilingual)
2022, Hugging Face 주도 국제 공동 연구
연구용 다국어 LLM, 176B
디코더 전용 트랜스포머. 46개 언어 & 13개 프로그래밍 언어
BLOOM은 Pre-LN(Layer Normalization) GPT 구조에 ALiBi 위치 바이어스와 StableEmbedding LN을 결합한 70-층, 176 B 거대 디코더-전용 모델이다. Megatron-DeepSpeed 기반의 8 × 텐서 + 8 × 파이프라인 병렬이 핵심 엔지니어링 포인트
ALiBi 위치 바이어스: 쿼리–키 어텐션 점수 자체에 선형 바이어스를 주는 방식을 사용
GLM (General Language Model)
ICLR 2023, 칭화대
BERT(마스킹), GPT(다음 토큰 제시), T5(인코더, 디코더 모두)의 장점을 통합. 문장 내부 임의 구간을 빈간으로 두고 순서 없이 예측하도록 학습. NLU, 조건부, 무조건 생성 모두에서 모델 1개로 고성능 추구
핵심 기술 요소
빈 간 채우기 & 2D 위치 인코딩
임의 길이 스팬을 한꺼번에 예측. 장거리 의존성을 학습
2D 포지셔널 인코딩으로 입력, 출력 위치를 분리해서 장문의 정확도를 높임
양방향 + 자동회귀
BERT처럼 양방향 인코딩으로 문맥 이해
GPT처럼 자동회귀 디코딩으로 생성
한 모델이 분류, 추론, 생성까지 처리
대규모 안정 학습
GLM-130B는 스파이크 로스 완화, 미세 혼합 정밀도, 데이터 커럼프션 탐지와 같은 엔지니어링 노하우 공유
Orca
2023, MS
LLaMA 13B 기반 소형 LLM. GPT-4를 단계적으로 모방 학습해서 사고력 향상
단계적 학습
Teacher-Assistant 학습
1. ChatGPT 3.5 turbo가 확정한 FLAN-5M으로 기초 능력 확보
2. GPT-4가 생성한 FLAN-1M 설명 추론으로 고급 사고력 주입
Explanation Tuning
단계별 사고 과정, 근거, 단계적 계획 등을 함께 학습
StarCoder
2023, Hugging Face × ServiceNow
15.5B 모델 오픈. 코딩 전용 GPT
8k 토큰 입력, MQA(Multi-Query Attention)기반 고속 추론, 코드 중간 삽입
MQA(Multi-Query Attention)
모든 헤드가 Q만 다르고 K, V는 공유. 메모리 사용과 지연 감소.
배치 추론 성능 11배 향상, 대기 시간 30% 절감
8k토큰: GPT3 대비 2배
인필링 형태로 코드 중간을 채워 넣도록 학습. 자동 완성, 리팩터링에 강함
KOSMOS
2023, MS
언어, 이미지 처리하는 멀티모달 LLM: 이미지 <-> 텍스트, 이미지에 텍스트 매칭 박스 좌표 도출, 텍스트-이미지 연계 이해와 추론
Gemini
2023, Google DeepMind
'Ultra-Pro-Nano' 3종을 시작으로 멀티모달 LLM 패밀리
텍스트, 코드, 이미지, 오디오, 영상을 동시에 학습해서 데이터간 정보 융합이 자연스러움.
트랜스포머 + MoE
1.5 부터 수백 개의 전문가 탑재
Ultra : GPT-4 보다 성능 우수
MMMU 59.4% - 복합 멀티모달 추론 최고 기록
멀티모달 & 효율적 AI (2023~2024)
이 시기부터는 LLM이 멀티모달 모델로 확장되었으며, 모델 경량화 연구가 활발히 진행되었습니다.
경량화
온 디바이스 & 네트워크 없는 상황에서도 QA, 번역, 코딩 도움 가능
비용 절감
커스텀 fine-tuning 가능 - LoRA 4bit -> 10만 문장으로 2시간 내 Fine-tuning 완료
엣지 AI - 스마트폰에서 7B 미만 모델 AI 적용
CLIP (2021, OpenAI) - 이미지-텍스트 연관성을 학습하는 멀티모달 모델
이미지와 텍스트를 매칭하는 방법 제시
Transformers로 텍스트 인코딩, ResNet이나 Visual Transformer로 이미지 인코딩 후, 대조학습으로 코사인 유사도로 올바른 이미지와 텍스트를 매칭함.
ClipCap(2021)
이미지 캡셔닝. CLIP으로 임베딩 뽑고 GPT2로 문장을 생성함
DALL·E
학습 1단계
이산 VAE를 학습하여 256 x 256 입력 이미지를 32 x 32 이미지 토큰을 만든다. 이 32 x 32=1024 토큰은 8192 voc 사전 크기를 가진다. 이렇게 입력 이미지를 192배 압축하면 흐릿하지만 어떤 것인지 알아 볼 수 있을 정도의 정보는 갖고 있다. 아래는 원본 이미지와 32 x 32 이미지 토큰으로 압축 했다가 복원한 이미지.
학습 2단계
캡션을 BPE 인코딩(Byte Pair Encoding, 서브워드 단위 토큰화)한 토큰과 이미지 토큰을 concat해서 Transformer에 입력. 텍스트와 이미지 토큰의 결합 확률 분포를 학습함.
생성 단계
DALL·E2 / UnCLIP (2022, OpenAI)
이미지 생성 모델
Prior에서 텍스트 임베딩으로 매칭되는 이미지 임베딩으로 매핑한다. 디코더에서 이 이미지 임베딩을 디퓨전 방식으로 이미지를 생성
Prior 부분: CLIP의 텍스트 임베딩을 Diffusion으로 이미지 임베딩을 생성함
Auto-Regressive와 Diffusion 두 가지 방법을 실험 후 Diffusion Prior를 채택함
Auto-Regressive Prior
이미지 CLIP 임베딩은 1024차원(FP32 1024 차원)을 PCA로 319차원으로 축소한다.
CLIP 텍스트 임베딩을 입력받고 Auto-Regressive로 이미지 임베딩 319차원을 한 차원씩 순차적으로 예측을 해서 이미지 임베딩 319차원을 완성한다. 이 이미지 임베딩 319차원을 역 PCA로 다시 1024차원으로 늘려서 완성한다.
Diffusion Prior
학습
텍트스 임베딩과 이미지 임베딩을 concat한후 이미지 임베딩에만 노이즈를 추가했다가 제거하는 방법으로 diffusion 학습
생성
텍스트 임베딩에다가 랜덤 노이즈를 concat한 후 이미지 임베딩의 노이즈를 제거해서 이미지 임베딩을 생성한다.
디코더: 텍스트 임베딩과 이미지 임베딩을 Diffusion으로 이미지를 생성한 후 업스케일링함
이미지 임베딩을 입력 받아서 U-Net으로 구현한 DDIM으로 이미지를 생성한다.
이 때 텍스트 임베딩을 U-Net에 추가로 입력 되어서 Cross-attention으로 사용된다.
이미지 생성 때 텍스트 임베딩의 적용 강도를 CFG로 조정한다.
Unet 구조로 입력 이미지의 노이즈 제거 수행하여 이미지 출력
생성한 64 x 64 이미지를 super resolution diffusion model로 1024 x 1024로 확대함
CoCa (2022)
기존 문제점
CLIP은 이미지와 텍스트를 임베딩공간에서 정렬하는데 특화. 범용 멀티모달 작업(검색, 분류)는 가능하지만 이미지 이해기반 텍스트 생성 어려움
이미지 캡션 모델(BLIP)은 cross-entropy loss로 문장 생성 학습했음. 텍스트 생성은 잘 하지만 Contrastive learning이 없어서 범용 멀티모달 작업(이미지와 텍스트 매칭 기반 검색, 분류. QA) 성능 부족함.
contrastive와 captioning을 별도 모델로 학습 하거나 복잡한 학습 구조가 필요했음
CoCa
contrastive와 captioning을 하나의 transformer에서 동시 학습하여 검색과 생성 한번에 가능
goal 별로 어떤 데이터를 얼만큼 학습 해야 어떤 테스트 셋에서 성능이 잘 나오는지를 250B token 데이터로 ablation해가며 분석
한국어 데이터셋인 KMMLU, 한국문화 데이터 셋인 HAERAE, 영어 데이터 셋인 MMLU에서 점수가 높게 나오는 것을 목표로 잡음
stage 1
ablation 0: baseline - 전체 데이터 셋 분포 유지
ablation 1: 일반 한국어 데이터를 50%만 사용
ablation 2: 일반 한국어 데이터를 2배 학습(2 epoch)
ablation 3: STEM 영어 데이터를 2배 학습(2 epoch)
일반 한국어 데이터를 50%만 사용(ablation 1)하거나 STEM 영어 데이터를 2배 학습(ablation 3)한 것이 성능 좋음. 그리고 영어 데이터 2배 학습하면 한국 문화(HAERAE)도 대답 잘했음.
그래서 '일반 한국어 데이터를 50%만 사용', '영어 데이터 2배 학습' 모두 반영했고 영어 데이터를 추가 정제 했음.
이 데이터 분포와 학습 방법론으로 stage 1 pre-training했음
한국어 관련해서는 성능이 높았으나 수학, 코딩 성능은 낮음
stage 2
stage 2 pre-training을 잘 하기 위해 17개의 ablation을 수행했고 ablabtion 12가 llama보다 성능 높고 가장 성능 좋아서 이 방법으로 stage 2 pre-training을 함
stage 2 성능 개선 비법
데이터 추가 정제 하는 것만으로도 성능 향상됨(stage 1의 데이터 셋 비율대로 데이터 샘플링한 후)
goal 별로 학습 데이터 분포를 최적화 해야함
STEM 데이터 비율을 늘리면 한국어 일반 성능도 올라감(KMMLU)
다른 LLM 에 비해 고품질 데이터라 learning rate를 크게하는 것이 좋음
코딩, 수학에 instruction data를 추가하면 수학 성능 좋아짐
그리고 SFT(supervised Fine-Tuning) 데이터 추가 하면 더 좋아짐
stage 3
stage 2 방법 그대로 데이터만 6B로 늘려서 추가 학습
annealing(learning rate를 처음엔 크게 갈수록 줄여감)으로 학습
학습한 checkpoint를 평균해서 최종 모델 도출
pretraining 총평
two-stgage, ablation, 추가 최적화로 llama-3.1-8B 대비 20%의 데이터 만으로 pre-training에서 더 좋은 성능확보
Kasana Nano 학습
Kasna Essence와 동일한 방으로 scratch 학습해도 llama-3.2-3B보다 성능 좋음
Kasna Essence를 Stage 2 데이터(0.3T)로 pruning & distillation했더니 scratch 모델 보다 성능 더 좋
Future Work
라이센스 데이터 삭제로 인해 부족한 영역은 성능 낮음
수치 연산은 별도 제작 했는데 부족해서 성능 낮음
이와 관련해서 DeepSeek 방법을 참고해 추가 웹 크롤링과 정제, 증대등으로 데이터 추가 확보 진행
Post-training
Post-training: 사람의 요구를 잘 알아듣고 그에 맞는 결과를 출력하도록 학습하는 것
post-training하는 방법
Supervised Fine-tuing
입력 프롬프트에 맞는응답을 생성하도록 학습
Preference based learning
입력 프롬프트에 대해서 여러 결과를 생성한 후 좋은 결과는 강화하고 안 좋은 결과는 약화하도록 학습
최종 결과
한국어 가장 우수, 다른 goal도 우수
학습 방법
Supervised Fine-Tuning
사람이 만든 학습을 위한 데이터는 단순하고 부자연스러운 어투이다.
실제 모델과 소통하듯 만든 데이터여야 성능이 잘 나온다.
그래서 자체 구축했다.
그리고 좋은 품질의 답변을 학습해야 생성 결과도 잘 나온다.
각 goal별로 해당 데이터 셋이 있어야 함. 다른 goal의 데이터 셋은 영향이 없다. 직접 해당 데이터를 제작, 정제했다.
Preference Learning
goal 별로 좋은 데이터를 잘 만드는 방법이 다르다.
수학은 자세한 답변 보다 정확한 답변이 더 중요하다.
off-line 학습: 여러 답변 중 좋고 나쁜 라벨을 보고 학습
on-line 학습: 데이터에 답안 없고 프롬프트만 있음. LLM의 답변을 제3의 모델이 평가를 해서 좋다, 나쁘다 평가를 하고 이 응답으로 학습을 함.
on-line 학습이 계속 학습 가능해서 더 성능 좋음
Post-training에서 중요한 점
실제 서비스와 유사한 어투와 멀티 턴 데이터가 성능에 매우 중요. 상용화된 모델은 이런 데이터를 상시 얻을 수 있어서 더 유리함
자연스러운 멀티턴 합성 데이터를 만들어서 코딩, 수학 goal에 반영 진행 중
Supervised Fine-Tuning -> Preference Leaning 까지 학습 하고 나서 On-line으로 (self로) prefernce Learning으로 스스로 정/오답을 만들어서 학습 진행
Online(Self-play) prefernece learning 관련 진행 연구
안정적인 학습 모델 연구
process supervision 연구: 정답을 맞추기 위한 추론 단계가 적절한지에 대한 학습 방법 연구
LLM 최적화(빠르고 비용 효율적으로 LLM 서빙하기 / if(kakaoAI)2024)
LLM 추론 최적화 기술
LLM 추론 최적화 기술
Inflight batching
Continuous batching
KV caching
Prefix caching
attention - paged attention, flash
Attention
Kernel fusion
Tensor parallel
Pruning / Distillation
Quantization
Speculative Decoding
양자화
inference 때에 단위 크기를 줄여서 메모리 로딩 부하를 줄여서 속도 향상(소요 시간 중 메모리 로딩 시간의 비중이 매우 큼). 모델 자체(Weight)를 양자화 할 수도 있고, activation(convolution 후 ReLU나 sigmoid같은 activation function의 결과값)도 양자화 할 수 있다.
FP32 분포의 Min, Max값을 INT8의 0, 255가 되도록 맞추면 FP32의 대부분의 값을 INT8로도 표현 가능
양자화 종류
Dynamic Quantization(동적 양자화)
Weight는 미리 양자화하고 activation은 실행 시점에 양자화
장점
CPU에서 속도 향상
연산량 많을 때 효과적
적용 쉬움: 데이터 수집, 범위 측정같은 calibration 없이 바로 적용가능
단점
양자화 오차로 정밀도 손실
연산 오버헤드 발생
Static Quantization(정적 양자화)
모델의 레이어 별 분포(min, max)를 미리 분석해서 양자화 파라미터(스케일, 제로 포인트)를 도출하여
Weight와 activation모두 미리 양자화 해놓음
장점
추론 속도 빠름
정밀도(accuracy) 높음
단점
사전 분석, 양자화 단계 필요
실시간 데이터의 분포가 달라지는 경우 오차 발생 가능
양자화 단계
1. model fusion
layer 들을 하나로 묶어줌. con-BatchNorm-ReLU를 Fusion
2. Formula Definition
Quantization 시 사용하는 식 정의
Quantization: FP32 - > Int8
Dequaltization: Int8 -> FP32
3. Hardware Deployment
인텔: FP32 -> int8 변환 위해 FP32 데이터 히스토그램 분포 분석
ARM: FP32 -> int8 변환 위해 Min, Max 값 도출
4. Dataset Calibration
스케일링 수식의 변수 값 정의
5. Weight Conversion
스케일링 수식으로 Weight를 FP에서 INT로 변환
6. Dequantization
inference 결과물을 다시 FP xkdlqdmfh qusrud
activation quntization까지 하면 속도 향상 있지만 성능 감소현상이 있음
Weight only Quantization VS 와 Activation 모두 Quantization Process
Weight only Quantization
가중치 텐서만 Int4, int3으로 저장. 연산 때는 int weight X FP activation 으로 계산해서 하드웨어 벡터화를 유지
Weight를 quantization했기 때문에 로딩 속도 빠름(gloabal memory(GRAM)->shared memoty -> registers). dequantization 에 드는 시간 보다 시간 절약.
가중치의 중요도가 다르다는 사실을 반영해서 중요도 상위 1%는 기존 유지하고 나머지는 3~4bit로 양자화
활성 채널의 중요도를 파악해서 1%를 선별. activation에서 진폭이 크면 양화 하기 여럽다. activation에서 진폭이 큰 부분의 크기를 줄인다음 weight 양자화에 적용한다. 그러면 weight only quantization만 으로 weight, activation 둘다 양자화 연산하는 효과를 낼 수 있다.
이 때 큰 진폭을 작게 줄일 때 손실을 최소화 하는 scale 수식은 아래와 같다. 아래 식을 보면 양자화, 역양자화를 위한 W, X를 사전에 구할 수 있어서 inference 때 연산을 줄일 수 있다.
TF-IDF(w,d) = 단어 w가 문서 d에 나타난 횟수 / 해당 단어가 등장한 문서의 수
TF-IDF는 해당 단어가 다른 문서에는 잘 안 나오고 특정 문서에서는 많이 나올 수록 값이 크다.
idf()는 log를 적용해서 정규분호화 해준다. 그리고 분모에 1을 더해서 분모가 0이 되지 않게 한다. n은 문서의 수.
Word2Vec (2013, Google) - 단어의 Word Embedding 학습
Bag of Words는 단어의 의미를 반영하지 못함.
Word2Vec은 단어의 의미를 반영한 임베딩 벡터를 만듦
아이디어
유사한 단어는 근처에 위치한다
단어는 여러 개의 유사도를 가질 수 있다.
CBOW(Continuous Bag Of Words)
대상 문서에서의 단어 빈도 수
주변 단어를 통해 타겟 단어를 예측 하는 신경망 모델
Skip-gram
한 단어를 기준으로 주변에 올 수 있는 단어를 출력하는 신경망 모델
Skip-gram 모델은 classificatin 모델에서 verification 모델로 변경
이전 버전: 어떤 단어를 입력하면 연관 단어를 출력하는 신경망 모델
현재 버전:
어떤 단어와 연관 후보 단어를 입력하면 유사도를 출력하는 모델
CBOW와 Skip-gram으로 단어를 학습 한 후 단어를 벡터로 표현하면 단어 벡터 간 연산 가능
king - man + woman = qween
단어간 유사도 측정, 단어간 관계 파악 가능
벡터 연산으로 추론 가능
한계
1단어 1벡터라 다의어 반영 어려움(ex. bank: 은행, 강둑)
문장 구조나 문장 전체 의미 도출에 어려움
GloVe (Global Vectors)
전체 단어와의 관련도, 다른 단어와의 상대적 관련 비율을 반영해서 임베딩
전역 빈도와 단어 의미 모두 담음
단어 빈도가 적어도 정확한 임베딩 도출 가능
Word2Vec은 주변 단어와의 의미를 담고 빈도는 모름
TF-IDF는 빈도만 반영하고 의미를 반영하지 못함
학습 방법
아래는 윈도우 1일 때(대상 단어의 바로 왼쪽, 오른쪽에 있을 경우 카운팅) 각 단어에 대한 빈도를 표로 정리
통산 윈도우는 5~10. 대칭행렬. 가로세로는 voc크기임. 대부분의 값이 0
위의 표를 이용해서 아래와 같이 등장 확률로 나타낸다.
ice라는 단어가 k에 해당하는 단어와 함께 나올 확률, steam이라는 단어가 k에 해당하는 단어와 함께 나올 확률을 구한다. 그리고 이 두 확률의 비율도 구한다.
그래서 ice와 단어 k와의 거리, steam과 단어 k와의 거리, 그리고 ice와 steam 중 어느 것이 k에 더 가까운지를 파악한다.
이렇게 각 단어의 상대적 출현 빈도와 벡터 임베딩을 모두 파악한다.
단어 간 함께 등장 확률이 높을 수록 임베딩을 유사하게 하고 확률이 낮을 수록 임베딩을 다르도록 학습함. (Word2Vec과 같은 아이디어)
GroVe도 Word2Vec과 성능은 유사함
한계점
동음이의어는 반영 못함. bank: 은행, 강
FastText (2016, Facebook)
word2vec은 문서에 안 나오거나, 잘 안나오는 단어, 오타 있는 단어는 임베딩 생성 못함
FastText에서는 단어를 n-gram으로 쪼개서 임베딩을 만들고 이 임베딩의 평균 임베딩을 사용한다.
n값에 따라 아래와 같이 모든 n길이의 셋으로 구성한다.
단어의 임베딩은 쪼갠 단어 셋과 단어 전체 임베딩의 합이다.
3-grams인 상태에서 eating의 임베딩은 <ea의 임베딩, eat의 임베딩, ati의 임베딩, tin의 임베딩, ing의 임베딩, ng>의 임베딩, eating의 임베딩을 모두 합해서 나온 임베딩이다.
그래서 학습 할 때 eating의 임베딩을 업데이트 하면 위의 임베딩 전체를 동일하게 업데이트한다.
n은 2~5와 같이 범위로 설정한다. 그러면 Orange의 임베딩은 아래의 22개 임베딩의 합이다.
Word2vec은 사전에 없는 단어면 없다고 나온다. FastText에 사전에 없는 단어가 들어와도 조합해서 임베딩을 출 력한다. 예를 들어 Oranges가 사전에 없어도 들어오면 기존 Orange와 다른 es, s의 임베딩으로 아래와 같이 임베딩을 구한다. 이렇게 Orange와 비슷한 임베딩이 출력 된다.
오타가 나서 Oranze라고 해도 아래와 같이 임베딩을 도출한다. 이렇게 Orange와 비슷한 임베딩이 출력 된다.
word2vec vs FastText
ELMO (Embeddings from Language Model)
word2vec, Glove는 동음이의어 처리 못함.
사과: 과일 vs 용서
ELMO는 문맥을 반영하여 동음이의어도 구분해서 표현 가능
ELMO는 forward, backward 두 모델로 학습하고 각각의 임베딩을 합쳐서 최종 임베딩 만듦
조금 더 자세히 설명하면 아래 그림의 1, 2, 3, 4와 같다.
UMLFit (Universal Language Model Fine-tuning for Text Classfication)
Transfer learning을 NLP에 적용
1. 3 layer Bi-LSTM 언어 모델을 pre-training
2. LM을 도메인에 맞게 fine-tuning
3. classifier를 fine-tuning
신경망에 적용
임베딩을 뽑은 후 ML 모델을 돌리면 신경망을 2번 실행하게 됨.
모델 자체에 임베딩 레이어를 포함시켜서 단순화 함
모델과 구현예
지역과 부동산 광고에 따른 적절한 가격을 예측하는 모델
아래에서 모델을 LSTM을 쓴 이유: 광고 문구 자체가 단어의 나열이라 순서 입력이기 때문.
핵심어 분석
빈도수에 따라 글자 크기 시각화: WordCloud
TF-IDF
sklearn의 TfidfVectorizer 사용
토큰 패턴 지정
(?u) : unicode로 설정
\b : 단어의 시작, 끝 표시
\w : 1글자를 표시
\b\w+\b : 1 단어 안에(단어의 시작과 끝 사이에) 1글자 이상이 들어 있음. 즉, 'I'와 같이 1자로 된 것도 단어로 인정해서 토큰화 하라. default 값은 2글자 이상만 단어로 인정.
위의 결과 후에 아래 실행. 'I like animals'의 각 단어에 대한 TF-IDF 값 출력.
'I'는 위의 vocabulary에서 index 3이니까 'I'의 TF-IDF 값은 0.37979767 임. I는 위의 documents에서 문장 마다 들어가 있어서 TF-IDF의 값이 작게 나왔음(범용적으로 흔한 단어는 낮게 나오고, 특정 사황에서 자주 나오는 단어는 높게 나옴)
'like'는 voc index가 4니까 TF-IDF값이 0.5728925임.
'animals'는 voc index가 0이니까 TF-IDF값이 0.72664149임. 한 번만 나와서 높게 나옴.
'I like animals and love animals'에서 'animals'는 2번이나 나와서 TF-IDF값이 0.90406978로 더 높게 나옴.
TF-IDF 기반 유사도 판단
영화 DB에서 제목과 요약 항목을 사용
입력 영화와 비슷한 영화를 출력하는 get_similar()를 만들어보자.
입력 값
영화 제목
indices: 영화 제목의 인덱스 리스트
cosine_sim : 영화별 TF-IDF를 뽑고 cosine similarity를 구한 결과
TF-IDF 구함: 영화 10000개 각각에 대해서 32350 단어 각각에 대한 TF-IDF 값 행렬 나옴. 10000 X 32350
TF-IDF 행렬을 영화 기준으로 내적해서 10000 X 10000 인 cosine 유사도 나옴.
함수
의미 연결망 분석(SNA, Semantic Network Analysis)
단어 관계 분석
단어와 연관된 단어로 주요 내용을 가늠할 수 있다.
의미 연결망 분석 예: 피자 댓글 분석
댓글 수집
댓글 수집해서 인접행렬 만듦
안접행렬을 그래프화
연결정도
노드 별 엣지 수
연결 중심성
어떤 노드와 연결 가능한 노드 중 직접 연결된 것의 비율
연결 중심성 = (특정 노드 i와 직접 연결된 노드 수) / (노드 i와 직/간접적으로 연결된 모든 노드 수)
'많다'와 직접 연결된 노드는 3개(치즈, 토핑, 종류)
'많다'와 직/간접적으로 연결된 모든 노드 수는 그냥 전체 노드 수임. 총 5개 노드 중 '많다' 1개 뺀 4개
'많다'의 연결 중심성 = 3/4 = 0.75
매개 중심성(다리 역할을 하는 정도)
어떤 노드가 다른 노드 연결에 얼마나 필요한가
A 단어의 매개 중심성 = (A 단어를 지나가야하는 단어 쌍의 수) / (A 단어를 지나가지 않는 단어 쌍의 수)
근접 중심성(Closeness centrality)
한 단어가 다른 단어들과 얼마나 가까이 있는지 측정
A단어의 근접 중심성 = (다른 단어 수) / (A와 다른 단어 간의 최단 거리의 총합)
Training
multi-class를 binary class로 변경하여 속도 향상
'not' 다음에 올 단어는? => 'not'다음은 'thou' 인가?
binary class로 아래와 같이 학습. 단어 간 input/output 확률 학습
번역
LSTM 얇으면 학습이 안되고, 두꺼우면 학습이 버겁다.
attention을 뽑아보자
음성 인식
TTS
기존 Concatenative TTS
음절, 음소 마다의 음성 파일을 이어 붙임
Autoregressive
t-1 정보 활용, 시간 순대로 산출
품질 높음, 속도 느림
텍스트와 소리 쌍 데이터만 필요
WaveNet (2016, DeepMind)
딥러닝 기반 오디오 생성 모델의 지평을 열음. 기존 Parametric, Concatenative TTS 대비 무척 자연스러운 음성 품질
autoregressive 모델로 음성 신호와 분포를 예측하여 파형을 생성함.
그래서 음성 뿐아니라 음악 등 모든 사운드를 모델링 가능
16k sampling rate 기준이다. 그러면 t 시점의 값 도출을 위해서는 과거 16000개 값이 필요하다. 16,000개의 데이터 값을 사용하기에는 receptive fiend가 좁다. 그래서 나온 방법이 Dilated Causal Convolution임
Stacked Dilated Causal Convolution Layer는 아래와 같이 적은 수의 층으로 더 많은 과거 값을 이용하면서도 효율적으로 출력값 도출한다.
Residual Blcok 하나가 노드 하나이다.
Casual conv: 시간 순서 고려한 Conv layer
더 깊게 쌓을 수록 1개 출력 값에 대한 입력 값을 더 늘릴 수 있다.
즉, 더 오랜 과거 시간을 반영할 수 있다.
대신 연산량이 너무 커짐.
Dilated Conv: 추출 간격 조절
추출 간격을 조절하여 더 넓은 수용 범위를 갖게 함.
그래서 layer를 조금만 싾아도 넓은 입력 시간 범위를 커버할 수 있다.
TACOTRON
encoder, attention-based decoder, post-processing network로 구성. 글자를 입력받아 스펙트로그램 프레임을 출력하며 이 스펙트로그램이 wav로 변환
CBHG 인코더 (Convolution Bank + Highway network + Bidirectional GRU)
문자 임베디에서 지역 n-gram과 장기 의존 정보를 추출함. 프리-넷(dropout bottlenet)으로 과적합과 발음 오류를 억제함
그리고 3X3 conv 2번해서 1X1로 만들면 가운데 부분의 픽셀 값은 가장자리 픽셀 값보다 더 여러 번(2번) 최종 값에 반영된다. 그래서 최종 값이 가운데 부분을 더 크게 반영하는 효과가 있다.
CNN 마지막에 FC layers 통과 하는 것은?
여러 가지 특징과 전체 영역을 종합해서 최종 판단하는 것. 객체는 고양이 같은데 배경이 물이면 수달 일 가능성이 더 크다.
pooling을 너무 많이 하면?
공간 정보를 잃는다. 계속 요약하므로.
CNN을 통과하면 자연스럽게 가운데를 중요하게 보게된다.
Convolution 차원 계산
입력 채널 수 만큼의 필터가 적용되고 각 채널에서 필터 적용해서 나온 feature를 모두 더해서 하나의 feature가 나온다.(통상 입력 채널 수 만큼의 필터가 준비되는 것은 별도 표시 안함. 입력 채널 수와 동일 하므로 표기 안해도 알 수 있기 때문). 여기에 이 conv에서 정의한 채널 수만큼 반복해서 이 feature의 채널 수가 정해진다.
패딩과 채널은 별도 언급 안함. 기존 크기 유지하도록 패딩 알아서 적용. 채널은 앞 채널과 동일. 커널 개수에 따라 feature map 채널 수 정해짐.
1x1 conv, 3 연산 예
GoogLeNet(inception)
22layers
inception 모듈(100 레이어 이상) 9개
500백만 weights
inception 모듈 구조(9개 모두 동일 구조)
입력을 나누고, 변형하고, 다시 합치는 전략
다양한 크기(1x1, 3x3, 5x5)의 커널 필터를 사용해서 다양한 특징을 추출하고 이것을 다시 합침
Bottlenet 구조
1x1 Conv를 사용해서 입력 크기는 유지하면서 채널 수를 줄임
아래 그림에서 1x1 conv 사용해서 3채널을 1채널로 줄임. 1x1 conv를 128개 써서 128채널로 변경 했다. 1x1 conv 개수만큼 채널 수를 늘리거나 줄일 수 있다.
Bottlenet을 쓰면 메모리 사용량 줄어듦
1x1 conv 없는 Inception 구조. 28 x 28 x 672의 메모리 소요됨
1x1 conv 있는 경우 28 x 28 x 480의 메모리 소요됨.
Bottlenet을 쓰면 연산량 줄어듦
Conv 연산량 = (k x k) x (m_i x m_i) x (c_(i-1) x c_i)
maxpooling은 연산량이 적어서 보통 연산량 산출에서 제외함
1 x 1 conv 없는 경우 총 854M 연산 소요
1 x 1 conv 있는 경우 총 358M 연산 소요
필터의 크기가 달라도 WxH가 동일하게 되도록 stride와 pading을 맞출 수 있다. 이렇게 conv를 여러 번 한 후 채널 방향으로 쌓으면 아래 그림 처럼된다. 이게 inception이다.
학습 보조기(auxiliary classifiers)
아래 구조도에서 노란색 배경 부분은 역전파가 잘 안될 때 중간에 값을 넣어주는 경로. 학습 때만 사용. 추론 때는 떼어냄.
Network in Network
conv에 MLP를 추가해놓은 구조. mlpconv라 부름. 단순 conv에 비해 더 복잡한 처리를 할 수 있다.
아래는 conv와 mlpconv 구조 비교
전체 네트워크 구조
Dense Layer(Fully Connected Layer(FC Layer))
클래스 분류 레이어. 보통 2개 사용
x는 이미지, y는 라벨
filters는 커널의 개수이다. 입력 채널 수 X 커널 개수 = 출력 채널. 커널 사이즈는 tensorflow/kera에서는 (높이, 가로)로 표시하고, pytorch에서는 (같은 값, 같은 값)으로 설정된다.
SSD (UNC Chapel Hill 대학, Zoox(자율주행차), Gogle, 미시간 대, 2016)
Mask R-CNN (Facebook ,2017)
MobileNetV2(CVPR 2018, Google)
모바일, 단말기에서 높은 정확도와 속도 가능
inverted residual 블록, linear bottleneck으로 크기 줄이면서도 정보 손실 최소화
inverted residual
manifold 분포에 그대로 ReLU를 적요하면 음수는 모두 0으로 치환되면서 음수 공간에 펼쳐져 있던 것들이 0으로 쪼그라 들면서 끊어지거나 겹쳐지게 되어 정보 손실이 발생한다.
그래서 manifold를 일단 고차원으로 옮긴 후 거기서 ReLU를 적용하여 정보 손실 없이 단순화 할 수 있다.
다시 차원을 원래 대로 줄일 때 ReLU 없이 1x1 Conv로 차원(채널)을 원래의 저차원으로 줄인다. 이 마지막 차원을 줄이는 부분을 'linear bottleneck'이라고 부른다. ReLU는 non-linear 인데 ReLU가 없다고 linear라고 구분해서 부르는 것임.
EfficientNet (2019, Google)
CNN의 깊이, 너비, 이미지 해상도를 모두를 최적으로 늘린 구조를 AutoML로 찾음(정확도, 계산량 최적화한 구조)
네트워크를 키우는 방법에는 폭을 넓히거나 깊게 하거나 해상도를 높이거나 복합적으로 하는 방법이 있다.
복합적으로 사용한 방법이 가장 정보를 잘 뽑아낸다.
ImageNet에서의 EfficientNet이 유사한 급의 다른 모델 보다 더 성능이 좋고 parameter 크기도 작다.
주로 쓰는 EfficientNet-B0 구조는 아래와 같다.
4. 트랜스포머 기반 모델 및 자율 AI (2020~2025)
Vision Transformer (ViT, 2021, Dosovitskiy et al.)
Transformer 구조를 활용한 최초의 이미지 인식 모델.
ViT는 전체적으로 처리할 수 있어서 객체감지에 효과적.
이미지 분할 -> 토큰+위치 임베딩 -> 클래스 토큰
CNN 보다 Transfomer가 나은 이유
이미지 전체 적인 정보를 뽑으려면 깊이가 깊어져야 하고 필터크기나 합성곱 영향이 큼
Transfomer는 self-attention으로 전체 문맥/상황을 파악하는데 유리함
대규모 이미지 데이터셋 확보로 Transfomer 활용이 가능해짐(ImageNet-21, JFT-300M 등)
주요 아이디어
이미지 패치 분할
패치 임베딩 + 위치 임베딩
클래스 토큰 사용
Transfomer의 인코더 사용
성능
pre-training(ImageNet-21k, JFT-300M) 후 fine-tuning(ImageNet-1k)하면 성능 우수
CNN 보다 성능 우수
CNN은 멀리 떨어진 영역간의 관계를 반영하기 어려웠는데(매우 깊어 져야 함) Transfomer에서는 self-attention으로 해결
position에 대한 attention을 확인해보니 전에는 객체의 일부분만으로 판단했는데 ViT에서는 객체 전체 영역으로 판단
단점
대규모 데이터 학습 전용(작은 데이터셋은이터셋은 성능 안 나옴)
비용: 토큰 개수에 대해 O(N^2). 고해상도에서 연산량 너무 커져서 효율 낮음
개발
1. Image Preprocessing and Transform
사전 학습 모델을 정의하고, 데이터 셋에 대해서 데이터 증강과 정규화를 함
2. 이미지 평가 Metric
인퍼런스 값과 라벨을 같이 받아서 정확도 리턴하는 함수 준비
ViT Model
모델을 로딩함
모델 구조 확인
Embedded Pathces
입력 이미지를 Convolution해서 768 사이즈의 임베딩 만듦
인코더 블록 : 보통 12개의 블록을 사용
Layer Normalization
Layer를 정규화함: 각 데이터에 대해서 해당 레이어의 출력 값이 일정 범위와 평균 값을 갖도록 레이어의 뉴런을 튜닝함
점, 사각형, 영역, 텍스트 등의 프롬프트를 이미지와 함께 입력 받아서 해당 부분을 세그멘테이션함(zero-shot 세그멘테이션)
: 원하는 부분 점 찍으면 해당 부분 세그멘테이션 함.
특징 2. 큰 인코더, 작은 디코더 구조(MAE(Masked Autoencoder)와 유사)
특징 3. 큰 학습 DB
객체 인식
2-stage 디텍터는 객체 후보 영역(Region Proposal) 뽑은 후 뭔지 판단하고, 1-stage 디텍터는 feature map으로 영역 도출과 분류를 한 번에 함.
2-stage 디텍터는 R-CNN 계열. 성능 좋지만 느림
1-stage 디텍터는 Yolo 계열, SSD 계열. 실시간.
A. Pioneer Work
딥러닝 이전의 객체 검출기술
1) Viola-Jones
2001년 제안. 얼굴 검출기로 주로 사용. 효율적이고 빨라서 소형 장치에서는 여전히 사용된다.
알고리즘은 4 단계(Haar 기능 선택, 통합 이미지 만들기, Adaboost 교육,캐스케이드 분류)로 구성됩니다.
Haar 기능
인간의 얼굴에 공통적 인 몇 가지 속성 :
눈 부위는 뺨보다 어둡습니다.
콧대 부분은 눈보다 밝습니다.
일치하는 얼굴 특징을 형성하는 속성의 구성 :
위치 및 크기 : 눈, 입, 콧대
값 : 픽셀 강도의 지향 그라디언트
2) HOG Detector
2005년에 HOG(Histogram of Oriented Gradients) feature extractor를 제안
HOG Algorithm은 일반적으로 보행자 검출이나 사람의 형태에 대한 검출 즉, Object Tracking에 많이 사용되는 Feature 중 하나이다. Image의 지역적인 Gradient를 해당 영상의 특징으로 사용하는 방법이다.
템플릿 매칭(template matching)의 경우에는 원래 영상의 기하학적 정보를 그대로 유지하며 매칭을 할 수 있지만 대상의 형태나 위치가 조금만 바뀌어도 매칭이 잘 안되는 문제가 있다. 반면에 히스토그램 매칭은 대상의 형태가 변해도 매칭을 할 수 있지만 대상의 기하학적 정보를 잃어버리고 단지 분포(구성비) 정보만을 기억하기 때문에 잘못된 대상과도 매칭이 되는 문제가 있다.
HOG는 템플릿 매칭과 히스토그램 매칭의 중간 단계에 있는 매칭 방법으로, 블록 단위로는 기하학적 정보를 유지하되, 각 블록 내부에서는 히스토그램을 사용함으로써 로컬한 변화에는 어느 정도 강인한 특성을 가지고 있다.
또한 HOG는 edge의 방향정보를 이용하기 때문에 일종의 edge기반 템플릿 매칭 방법으로도 볼 수 있다. Edge는 기본적으로 영상의 밝기 변화, 조명 변화 등에 덜 민감하므로 HOG 또한 유사한 특성을 갖는다고 생각할 수 있다. 또한 HOG는 물체의 실루엣(윤곽선) 정보를 이용하므로 사람, 자동차 등과 같이 내부 패턴이 복잡하지 않으면서도 고유의 독특한 윤곽선 정보를 갖는 물체를 식별하는데 적합한 영상 feature이다.
HOG를 local feature인 SIFT와 비교해 보면 HOG는 일종의 템플릿 매칭이기 때문에 물체가 회전된 경우나 형태변화가 심한 경우에는 검출이 힘들지만 SIFT는 모델의 특징점과 입력 영상의 특징점에 대해 특징점 단위로 매칭이 이루어지기 때문에 물체의 형태변화, 크기변화, 회전 등에 무관하게 매칭이 이루어질 수 있다. 이러한 특성에 비추어 보았을 때, HOG는 물체의 형태변화가 심하지 않고 내부 패턴이 단순하며 물체의 윤곽선으로 물체를 식별할 수 있을 경우에 적합하고 SIFT는 액자 그림과 같이 내부 패턴이 복잡하여 특징점이 풍부한 경우에 적합한 방법이다.
3) DPM
DPM(Deformable Parts Model)은 2009년 Pascal VOC 챌린지에서 우승. 딥러닝 이전의 가장 우수한 객체 검출기
물체의 개별 "부분"을 감지하고 가능한 조합인지 여부로 검출하여 HOG보다 정확도 높음
예) 인체는 머리, 팔, 다리 및 몸통과 같은 부분의 집합으로 간주. HOG는 인체 전체에 대한 templet을 갖고서 비교를 한다. 사람은 팔 다리가 움직여서 HOG로 검출하기에 어렵고 신체 부분을 따로 HOG를 적용하고 취합하면 보다 유연하게 판단할 수 있다. 각 부분 별로 SVM 감지 모델이 동작하고 감지된 결과 조합에서 있을 수 없는 결과는 제거하여 최종 결과를 도출한다.
첫 번째 Two-Stage 딥러닝 객체 검출기. 혁신적이었지만 너무 느렸다(inference에 47초/장, 작은 DB 학습에 몇 일)
Region Proposal을 활용한 객체 검출 모델.
단점
box 2000개 모두 feature를 뽑느라 너무 오래 걸린다.
CNN, SVM, Bounding box regression을 end-to-end로 학습할 수 없다.
=> 위 단점을 해결한 fast Fast R-CNN이 나온다
동작 순서: selective search로 객체 후보 box를 최대 2000개 추출 -> 각 box를 227X227로 리사이즈(warp)해서 CNN에 넣어서 4096 차원의 feature 추출 -> SVM으로 객체 인식 -> bounding box regression으로 위치 정의
Selective search
색상, 질감, 영역 크기 등으로 non-object-based segmentation을 수행. 이 작업으로 많은 small segmented areas를 얻음
-> bottom up 방식으로 small segmented areas들을 합쳐서 더 큰 segmented areas들을 만든다. 이 작업을 반복하여 최종적으로 2000개의 region proposal을 생성
CNN
AlexNet의 구조를 그대로 사용해서 각 region proposal box(224x224크기로 변환) feature vector를 추출한다.(224x224 -> 4096x1)
SVM
추출된 2000개 feature vector에 대해서 어떤 객체인지 classification한다.
NMS(Non-Maximum Suppression)
SVM으로 나온 score 값으로 박스 개수를 줄임. 동일 물체에 대한 box는 가장 score높은 하나만 남기고 제거함
두 box의 교집합 영역의 비율인 IoU(Intersection over Union)이 0.5 보다 크면 동일한 물체에 대한 box로 판단하고 가장 score 높은 상자만 남기고 나머지 box는 지운다.
Bounding box regression
box의 위치를 교정해준다.
중심 좌표(x, y), width, height를 regression을 통해 적절한 값을 뽑는다. 그 차이 값 만큼 box를 이동, 크기 변경 해준다.
RCNN은 2000번 CNN연산 하는데 SPP-Net은 1번만 CNN하니까 시간 단축된다.
SPP에서 고정 크기의 벡터를 뽑는 방법은 아래와 같다.
256개 feature map에서 객체 후보 영역으로 지목되어서 잘라진 각 feature에 대해서 windows size와 strade를 적절히 설정해서 pooling하여 출력 크기가 1x1, 2x2, 4x4 가 되도록 한다. 이것을 1차원으로 펴고 이어 붙이면 21개의 숫자(21 bin)이 된다(경우에 따라 30bin, 50bin을 사용하기도 한다. 여기서는 그림 데로 21 bin으로). feature map이 256개 이므로 한 region proposal box에 대해서 256X21 차원 벡터가 생성됨. 이것이 fully connected layer에 입력으로 들어감. 이런 식으로 입력 이미지 크기가 달라도 fully connected layer에 들어가는 벡터의 크기는 고정되게 된다.
이 때 1x1, 2x2, 4x4 pooling은 max pooling을 하는데 이것의 의미는 아래 그림과 같다. feature map 한장 한장에는 나름 각 class에 대한 특징위주로 feature 값들이 뽑혀져 있을 텐데 pooling을 통해서 가장 두드러진 class의 특징 값들을 추려내는 것이다.
이렇게 pooling으로 뽑힌 feature vector로 fully connected layer를 통과 시켜서 최종 feature를 뽑고 이것으로 SVM으로 classificaiton을 하는 것이다.
Fast R-CNN (MS, 2015)
SPPNet과의 차이점
SPPNet은 RoI pooling때 3개 크기(피라미드) feature뽑는데
Fast R-CNN은 7x7 1개만 쓴다
SPPNet은 마지막에 분류로 SVM을 돌리는데
Fast R-CNN은 softmax를 쓴다
그래서 더 빠르다.
R-CNN/SPPNet의 주요 문제 중 하나는 CNN, SVM, Bounding box regression을 각각 학습 시켜야 한다는 것 이었다.
end-to-end training이 가능하고 속도와 정확도 향상 되었다. SPPNet보다 3배 더 빠른 학습 속도, 10배 더 빠른 inference 속도를 보이며 Pascal VOC 2007 데이터 셋을 대상으로 mAP 66%를 기록
2000개의 feature map을 사용하지 않아도 되어서 disk를 사용하지 않아서 속도 더 빨라짐
수행 과정
1-1. R-CNN에서와 마찬가지로 Selective Search를 통해 RoI를 찾는다.
3. projection시킨 RoI에 대해 RoI Pooling을 진행하여 고정된 크기의 feature vector를 얻는다. (이 부분이 SPP-Net과 같은 과정인데 SPP-Net은 1x1, 2x2, 4x4으로 pooling, Fast R-CNN은 7x7 한개로 pooling)
4. feature vector는 FC layer를 통과한 뒤, 두 브랜치로 나뉘게 된다.
5-1. 하나는 softmax를 통과하여 RoI에 대해 object classification을 한다. (SVM 대신 softmax로 classificaiton을 한다.)
5-2. bounding box regression을 통해 selective search로 찾은 box의 위치를 조정한다.
RoI Pooling
SPP에서는 RoI Pooling 때 3개 이상의 사이즈로 pooling을 하는데 fast R-CNN에서는 7x7 사이즈 1개 피라미드 만 사용한다. 1개 피라미드 SPP로 고정된 크기의 feature vector를 만든다. 입력 RoI 크기가 다양할 텐데 stride를 적당히 잡고 Max pooling해서 결과는 fixed length feature vector인 7x7을 만든다.
Classification & Bounding box regression
SVM 대신 softmax를 사용해서 classificaiton함
Loss function
Classificaiton의 loss와 Bounding box regression의 loss를 더해서 동시에 학습
단점
이미지 1장당 2.3초로 많아 빨라졌지만 real-time은 아직 아님
2.3초 중 2초가 region proposal에 소요
Faster R-CNN (중국과기대, 중국 MS, 중국 Facebook, 2016)
최초의 실시간 객체 검출기
Fast R-CNN과의 차이점
Fast R-CNN는 bounding box 후보 추출을 CPU로 돌림
Faster R-CNN은 CNN 기반의 Region Proposal Network로 만들어서 GPU로 돌림
이 과정에서 feaure 영역 추출을 3가지 크기, 3가지 가로세로비로 고정해서 효율 올림
GPU라 더 빠름
Fast R-CNN에서 2.3초 중 2초가 region proposal에 소요되어 이것을 deep network를 사용하여 속도를 개선함. 이 부분 외에는 faster R-CNN과 구조 동일함
Fast R-CNN에서는 region proposal이 CPU에서 돌기 때문. GPU로 돌리기 위해서 Conv layer로 만든 Region Proposal Network(RPN)으로 RoI를 구한다.
Anchor Box
Anchor box는 sliding window의 각 위치에서 bounding box의 후보로 사용되는 box다. 기존에 주로 사용되던 image/feature pyramids와 Multiple-scaled sliding window와 다음과 같은 차이가 있다.
여기서는 동일한 크기의 sliding window를 이동시키며 window의 중심점을 중심으로해서 사전에 정해진 다양한 비율/크기의 anchor box들을 적용하여 feature를 추출한다. 이것은 imag/feature pyramids 처럼 image 크기를 조정할 필요도 없고, multiple-scaled sliding window처럼 filter크기를 변경할 필요도 없어서 계산 효율이 높다.
논문에서는 3가지 크기에 대해서 3가지 가로세로비의 사각형 조합해서 9가지 사각형 모양을 anchor box로 사용한다. 이를 통해서 다양한 크기의 객체를 포착할 수 잇다.
Region Proposal Network
feature map을 3x3x256 convolution을 통해서 intermediate layer를 만들고 이것을 대상으로 1x1x2(객체/배경 2class)x9(9개 anchor box) 로 classification result(hxwx18)와 bounding box regression result(hxwx36)를 뽑느다. 이것을 원본 feature에 대입하면 object로 classification된 객체를 해당 위치에서 약간 box 보정을 한 box를 그린다.
FPN(feature pyramid network)는 컴퓨팅 자원을 적게 쓰면서 다양한 크기의 객체를 인식한다.
FPN 이전에 다양한 크기의 객체를 인식하는 방법
Featurized Image Pyramid
이미지 크기를 바꿔가면서 feature map을 뽑고 각각의 feature map을 사용한다. 느리다.
Single Feature Map
conv layer가 크기 변화에 강하기 때문에 CNN을 통해 얻은 마지막 feature map 만으로 객체 인식을 한다. 작은 물체에 대한 정보는 사라진다는 단점이 있다. YOLO에서 사용한 방법.
Pyramidal Feature Hierarchy
Single Feature Map에서 모든 feature map을 활용해서 객체인식을 한다. feature map 마다 독립적으로 동작하기 때문에 다른 feature map에서 정보를 추출한 것이 있어도 활용하지 않는 다는 점이 비효율적이다. SSD에서 사용한 방법.
FPN
feature를 뽑고 최종 feature map에서부터 객체 검출을 하고 이 feature map과 그 아래의 더 큰 해상도의 feature map에 합친 후 다시 객체 검출을 한다. 이렇게 상위 레이어의 추상화된 정보와 하위 레이어의 작은 물제 정보를 동시에 살려서 검출을 수행한다는 점이 특징이다.
아래 그림과 같이 상위 레이어의 feature map을 2배 크기로 키워서 크기를 동일하게 맞춘 후 하위 레이어의 feature map과 합친다.
bottom-up pathway에서는 특징을 압축해 가는 과정이다. conv1은 크기가 커서 피라미드에 포함시키지 않는다.
FPN 활용: FPN은 semantic information을 잘 뽑는 네트워크를 만드는 것이 목표이다. 그래서 이 네트워크를 Fast R-CNN에 결합해서 사용할 수 있다.
Fast-RCNN에서는 ROI pooling을 이용해서 ROI 영역을 잘라낸다. 잘라낸 roi의 크기를 보고 스케일이 비슷한 feature map의 feature를 잘라서 네트워크로 보낸다.
R-FCN는 이미지 내의 객체의 위치 정보에 기반한 fully convolutional network이다. Faster R-CNN에서 RPN 이후의 단계를 수정해서 속도를 크게 개선했다.
Translation invariance Dilemma (이동에 강함이 딜레마)
classification에서는 이미지 내에서 객체 위치가 바뀌더라도 동일한 객체로 인식하는 것이 중요하다.(Translation invarinace가 중요하다)
detection에서는 동일 객체라도 이미지 내에서 위치가 바뀌면 이를 잘 반영하는 것이 중요하다.(Translation variance가 중요하다)
2 stage detector는 feature extractor와 detector가 있다. feature extractor인 backbone network는 classifier로 pre-trained되어 있다. 그래서 위치 정보가 없어진/줄어든 feature map이 detector에 입력으로 들어간다. detector는 바운딩박스 그려야해서 위치 정보 필요함. 위치정보 없어진 feature map이 입력되어서 detector 학습이 잘 되지 않는다. 이것이 translation invarinace dilemma이다.
Translation invariance Dilemma를 풀기 위해 R-FCN은 RPN을 통해 추출한 RoI끼리 연산을 공유하면서 객체 위치에 대한 정보를 포함한 feature map을 사용한다.
검색하려는 객체의 각 부위를 class로 보고, 아래 그림 예에서는 아기의 신체 부위 별로 9가지의 class로 나누고 각 class의 feature를 뽑도록 convolution layer를 만든다. 이미지가 CNN을 통과 하면 기본 feature map이 나오고 이 feature map이 앞의 convolution layer를 거치면 각 class별(각 신체 부위별) 특징을 나타내는 feature map들이 나온다. 여기에 ROI에서 뽑은 후보 사각형의 영역에서 feature 를 뽑는다. 각 신체 부위별 feature map에서 조각 조각 뽑고 위치에 맞춰서 이어 붙여서 하나의 feature를 완성한다. 이것을 softmax로 해서 총액이 기준값을 넘으면 해당 객체가 맞다고 판단한다. 신체 부위 별 feature map에서 해당 조각이 나왔어야 총점이 높게 나올 것이기 때문.
Mask R-CNN (Facebook ,2017)
COCO 2016 대회에서 1등, 5fps속도
Mask R-CNN의 차이점
detection에다 segmenation까지 해준다.
Faster R-CNN 에다 RoIAlign과 mask branch를 추가하여 픽셀 단위 segmentaion 가능
Mask R-CNN = Faster R-CNN + mask branch.
mask branch: object의 mask를 예측하는 branch로 small FCN(Fully Convolution Network)
stage 1: RPN(Region Proposal Network)
stage 2: 각 ROI마다 class, box 위치, mask 도출
Mask branch
아래는 Faster R-CNN 논리적 구조다.
Mask R-CNN은 분류 brach에 mask branch를 추가
RoIAlign: feature map에서 RoI에 해당하는 값을 정확히 뽑는 방법
Faster R-CNN에서는 RoI Pooling을 사용하면 입력 이미지 크기 상관 없이 고정된 크기의 feature map을 얻을 수 있다. 하지만 feature와 RoI 간의 약간의 오차가 생긴다. Pooling과 quantization 때문.
아래와 같이 대충은 맞지만 정확하지는 않다.
Mask R-CNN에서는 RoIAlign으로 픽셀간 보간(interpolation)으로 RoI가 정확히 정렬 되도록 함. 정확도 10~50% 향상.
아래와 같이 보간으로 정확히 뽑겠다는 것
(1) RoI projection을 통해 얻은 feature map을 quantization 하지 않고 그대로 사용. projection된 feature map을 3X3으로 9분할 함
(2) 각 cell에서 3x3으로 나누는 경계 모서리에 있는 점 4개를 선택한다.
(3) 점 4개 각각의 값을 아래와 같이 주변 4개의 feature 값을 이용한 bilinear interpolation으로 도출한다.
점 4개중 첫 번째 점의 값을 구함
같은 방법으로 2~4번째 점의 값도 구함
(4) 모든 Cell에 대해서 (2)~(3)을 반복한다.
(5) 각 Cell의 점 4개 sampling point에 대해서 max pooling을 해서 해당 RoI에 대한 3X3 feature map 을 구한다.
Loss funciton
L = classification Loss + bounding box loss(Faster R-CNN과 동일) + mask loss(binary cross entropy loss)
mask branch에서 출력한 Km^2에서 feature map의 각 cell에 sigmoid function을 적용한 후 loss를 구함
backbone network: ResNet과 FPN 을 사용
Training
(1) Image Pre-processing
원본 이미지의 가로, 세로 중 짧은 길이가 적어도 800이되도록, 긴 길이가 1333을 넘지 않도록 가로세로비를 유지하면서 resize한다.
(2) FPN(Feature Pyramid Network) by backbone network
전처리된 이미지를 ResNet-FPN backbone network에 넣어서 Feature Pyramid {P2, P3, P4, P5, P6}을 얻음
(3) RPN(Region Proposal Network)
(2)에서 얻은 feature pyramid 별로 RPN에 입력해서 ojbectness score와 bbox regressor를 가진 Region proposal을 출력
(4) Select best RoI
(3)에서 얻은 Region proposal 중 최적의 RoI를 선택한다.
1) ojbectness score가 높은 top-k개의 anchor를 선정. k=12000
2) bbox regressor에 따라 anchor box의 크기를 조정
3) 이미지 경계를 벗어나는 anchor box를 제거
4) threshold-0.7로 지정하여 NMS(Non maximum suppression, 동일 객체에 여러 box있을 경우 가장 스코어 높은 1개만 남김) 수행
5) 전체 feature pyramid level(P2, P3, P4, P5, P6) 에 대해 1)~4)를 모두 수행. 그 후 모든 feature pyramid level의 anchor box에 대한 정보를 concatenate함
6) 결합된 모든 anchor box에 대해 objectness score에 top-N개의 anchor box를 선정. N=2000
(5) RoI Align layer로 feature map 도출
(4)에서 얻은 RoI를 feature pyramid(P2, P3, P4, P5, P6)중 어떤 scale의 feature map과 매칭할지를 아래 공식으로 결정.
(5)에서 얻은 7x7 크기의 feature map을 fc layer를 거쳐 classificatoin branch, bbox regression branch에 전달해서 class score, bbox regressor를 얻음
(7) Mask segment
(5)에서 얻은 7x7 크기의 feature map을 mask branch로 전달.
mask branch는 3x3 conv - ReLU - deconv(by 2) - 1x1(xK) conv layer로 구성 (K는 class 수). 이를 통해 14x14(xK) 크기의 feature map을 얻음. feature map 중 가장 높은 score의 class에 해당하는 feature map 1개를 선정하여 최종 prediction에 사용. 이 feature map의 각 값을 sigmoid 함수를 적용하여 0~1 사이의 값을 갖도록 조정함
(8) Post-processing
(7)에서 얻은 1개의 14x14 feature map을 원본 이미지의 mask와 비교하기 위해 rescale함. 그 후 각 픽셀 값이 0.5 이상인 경우 1을 할당. 미만인 경우 0을 할당. mask segment 생성 완료.
Inference
Proposal layer 구간에서 모든 feature pyramid에 걸쳐 상위 1000개의 RoI를 선정. 이 1000개 RoI를 classificaiton branch와 bbox regression branch에 입력하여 나온 결과에 NMS(Non maximum suppression)을 적용하여 상위 100개를 mask branch에 입력.
FPN을 bottom-up backbone layer에 추가한 Recursive Feature Pyramid를 제안. 다양한 atrous rate로 얻은 feature를 switch function을 통해 모아주는 Switchable Atrous Convolution을 제안.
Recursive Feature Pyramid
아래 그림에서 (a)는 일반 FPN(Feature Pyramid Network)
아래 그림의 (b)는 RFP(Recursive Feature Pyramid)가 포함된 버전.
아래 그림의 (c)는 (b)에서의 recursive연산을 unroll한것. t는 unroll stop. ASPP(Atrous Spatial Pyramid Pooling)을 connecting module R로 사용. 각 feature layer에서 connecting해서 ResNet backbone에 합쳐지는 방법은 아래 그림과 같다.
ASPP(Atrous Spatial Pyramid Pooling, DeepLab V3)
아래 그림의 (a)처럼 통상의 convolution에서는 깊어질 수록 output feature map 크기가 작아져서 segmentation하기에 부적합해진다.
아래 그림의 (b)처럼 Atrous convolution에서는 output feature map을 크게 유지 할 수 있어서 segmentation에 유리하다.
Swithable Atrous Convolution
Swithable Atrous Convolution는 2개의 global context modules와 SAC(Switchable Atrous Convolution)으로 구성. SAC를 통해 input이 두 가지의 다른 atrous rates를 바탕으로 연산하여 더욱 정교한 모델을 만든다. Global context는 일종의 SENet으로 global information을 더해주어 정확도를 높여준다.
YOLO v1은 grid cell 별로 2개의 bounding box만을 사용하여 정확도가 떨어진다. SSD(Single Shot MultiBox Detector)는 더 많은 bounding box를 사용하여 정확도를 올렸다.
YOLO v1의 경우 단일 scale의 feature map을 사용하기 때문에 다양한 크기(특히 작은 크기)의 객체를 검출하기 어렵다. SSD는 VGG16을 base network로 사용하고 보조 network(auxiliary network)를 추가한 구조다. 두 network를 연결할 때 fc layer를 conv layer로 대체하면서 detection 속도가 올랐다. Convolutional Network 중간의 conv layer에서 나온 feature map을 포함해서 총 6개의 서로 다른 scale의 feature map을 사용한다. feature map의 각 cell 마다 서로 다른 scale과 가로세로비를 가진 bounding box인 default box를 사용하여 객체 위치를 추정한다.
YOLOv2 and YOLO9000 (University of Washington , Allen Institute for AI, 2016)
CVPR 컨퍼런스에서 “YOLO9000: Better, Faster, Stronger”라는 이름으로 논문이 발표
YOLO v1은 class 20개 , v2는 9000개로 늘림
Batch Normalization, Direct Location Prediction, Multi-Scale Training을 도입해서 FPS와 mAP 개선. SOTA
Better
Batch Normalization
기존 모델에서 Dropout layer를 제거하고 Batch Normalization을 추가. 이를 통해 mAP가 2%증가
High Resolution Classifier
YOLO v1에서는 입력 이미지(448x448)와 VGG 모델의 해상도(224x224 크기로 학습)가 맞지 않았음
YOLO v2에서는 큰 이미지에서 학습한 모델로 fine tuning해서 4% mAP 향상.
Convolutional With Anchor Boxes
yolo v1의 마지막 부분에 있던 Fully Connected layer 2개를 없앴다. 그리고 입력 이미지 크기를 448x448에서 416x416으로 축소해서 속도도 빨라지고 grid cell이 홀수가 되어서 grid cell의 가운데 셀이 중앙에 위치해서 이미지 중앙의 객체를 검출하는데 효과적이다.
RetinaNet
EfficientDet
EfficientNet을 백본으로 하는 객체 인식 모델
BiFPN(Weighted Bi-directional Feature Pyramid Network)와 복합 스케일링(Compound Scaling)으로 성능 향상
이전 프레임의 객체와 현재 프레임에서 Kalman Fiter로 예측한 객체의 IOU 로 동일 객체 여부 판단
Feature Vector
위 방법만으로는 tracking 중 잠깐 일부라도 가려지면 놓친다.
Feature로도 동일 여부를 확인한다. 그러면 잠깐 놓쳐도 feature로 동일 여부 확인하고 트레킹 이어서한다.
구조
장점
높은 정확도, 안정적인 트레킹
단점
feature에 배경 정보가 포함되어서(segment아니고 box다 보니) bounding box가 크게 잡히면 feature matching이 잘 안됨
세그멘테이션
SegFormer (2021)
픽셀단위 세그멘테이션 모델
특징
training/test 이미지 크기 변화에 따른 오류 요인을 제거
Hierarchical Transformer Encdoer: transformer를 활용하면서도 positional encoder는 제거해서 했음. 위치 정보가 없어서 이미지 크기 변화 상관 없음
이미지 크기 변화 시에도 MLP로 안정적 결과 도출
구조
계층적 트랜스포머 인코더
Transformer는 입력, 출력의 차원이 같아서 이미지 해상도가 올라갈 수록 전역적으로attention을 구하는 계산량이 기하급수적으로 늘어난다.
segFormer에서는 계층적으로 크기를 줄여가기 때문에 여러 해상도에서 다양한 표현을 학습하고 연산량도 적어서 빠르다.
가벼운 MLP 디코더
UNet에서 처럼 인코더의 단계 별로 넘겨 받은 특징 맵을 동일한 해상도로 upsampling한다. 이것을 겹친후 MLP로 각 필셀 별 클래스 확률을 출력한다. 이 확률값으로 segmentation 출력한다.
이렇게 단순한 MLP만으로 디코딩 가능한 이유는 트랜스포머가 동일한 깊이의 CNN 인코더에 비해 더 넓은 영역을 반영하고 있기 때문(더 넓은 Receptive Field를 갖고 있음).
아래는CNN 기반인 DeepLabv3+와 SegFormer의 receptive field 표현. SegFormer는 처음부터 전역을 반영
Semantic Segmentation (클래스 별 세그먼트)
클래스 별 세그멘테이션. 다른 객체라도 동일 클래스는 동일 세그먼트
슈퍼픽셀
비슷한 픽셀들을 묶어서 영역을 넓혀감
FCN (Fully Convolution Network)
CNN으로 세그멘테이션 했음. 초기 모델이라 성능은 낮음
FCN + CRF(Conditional Random Field)
FCN 결과에 CRF를 여러 번 적용해서 엣지를 더 정확히 함
CRF(Conditional Random Field)
세그멘트 별로 세그멘트 확률 값을 얻는다. 각 세그멘트에 대해서 아래를 반복함
색상이 비슷한 픽셀이 가까이 있으면 동일 세그멘트로 통합
색상이 비슷해도 거리가 멀면 다른 세그멘트
세그멘트 별 확률값 이미지
CRF 반복
최종 세그멘트
SegNet
인코더 디코더 구조의 CNN 모델
인코더는 VGG의 13개 레이어 그대로 사용
U-Net
Deeplab
Dilated Convolution으로 CNN + CRF
Dilated Convolution
receptive field를 좀 더 넓게 보기 때문에 큰 객체를 인지하고 넓은 영역의 정보를 종합한다.
Fully connected CRF로 경계선을 좀 더 정교하게 한다.
CRF는 인접 픽셀만 고려하는 대신 Fully connected CRF는 전체 픽셀을 고려한다.
그래서 더 정교하다.
PSPNet(Pyramid Scene Parsing Network)
feature map을 피라미드 처럼 다양한 크기로 만든다.
작은 크기의 feature map을 원본 feature map 크기로 다시 확대해서 하나로 겹친 후 세그멘트 도출
이렇게 하면 지역 정보와 글로벌 정보를 모두 감안해서 세그멘테이션 함.
Instance Segmentation (개별 객체 세그먼트)
객체 별 세그멘테이션. 동일 클래스라도 다른 객체는 다른 세그먼트
Instance sensitive FCN (2016)
기존 FCN은 클래스는 예측하지만 객체를 구분하지는 못함
Instance sensitive FCN은 Instance senstive score map으로 개별 인스턴스에 대해 다른 응답 패턴을 갖도록 학습.
이 instance sensitive score map과 객체 점수를 겹쳐보면 객체만 남는다. 여기서 instance별로 다르게 세그멘트한다.
FCIS
2016년 COCO 세그멘트 대회에서 1등. 0.24초/장
마스크 반전을 통해 후보 영역에서 내부/외부 점수 맵을 종합해서 인스턴트 판단. 정확도 향상됨.
ROI 내부/외부 맵으로 객체 여부 판단
객체 영역 각각에 대해서 내부/외부 맵으로 세그멘트 영역과 클래스 판단함.
Mask R-CNN
Faster R-CNN으로 feature map상에서 객체 영역을 뽑고 여기서 Faster R-CNN의 ROIPool 대신 ROIAlign을 사용하여 인스턴트 세그멘트 도출
ROIAlign
Faster R-CNN의 ROIPool은 다른 사이즈의 Regin Proposal이 들어와도 max pooling으로 output 사이즈를 동일하게 만듦. 그래서 입출력 간에 픽셀 단위에서는 정렬이 맞지 않음.
ROIAlign은 feature map에서 근접한 grid point(파란색 화살표 시작점)을 bilinear interpolation 으로 정확한 feature 값을 도출함
PANet (Path Aggregation Network)
(a) FPN(Feature Pyramid Network) 한 후에 (b)에서 bottom-up으로 저수준(원본크기)의 특징을 고수준에 전달함. 그래서 저 정확한 세그멘트 엣지 도출함.
YOLACT (You Only Okk At CoefficienTs)
single-stage 구조의 대표적 instance segmentation 모델
프로토타입 마스크 생성하고 인스턴스 별 마스크 계수 예측
FPN으로 feature map을 구함
mask 프로토타입을 뽑음
마스크 프로토타입 별로 클래스에 얼마나 해당하는지를 계수(coefficient)로 산출함. 프로토타입별로 계수를 반영해서 더하면 사람 마스크, 라켓 마스크로 구분이 된다.
이 마스크를 적용하면 객체 별 세그먼트가 나온다.
Panoptic Segmentation (개별 객체에 배경도 구분해서 세그먼트)
Panoptic Feature Pyramid Netowrks
FPN에서 나온 FPN으로 인스턴스 세그멘테이션도 하고 시멘틱 세그멘테이션도 진행함.
인스턴스 세그멘테이션 진행
FPN으로 Mask-RCNN을
시멘틱 세그멘테이션 진행
FPN의 각 크기별 feature map을 다시 feature map 원본 크기로 확대해서 세그멘트 뽑음
UPSNet
FPN에서 시멘틱 헤드와 인스턴스 해드를 뽑음.
인스턴트 헤드로 개별 객체를 뽑고, 시멘틱 헤드에서 객체와 배경 세그먼트를 뽑은 후 모두 합쳐서 최종 세그멘트 출력함
VPSNet
비디오용 panoptic sementation 모델, 실시간
이전 프레임과 현재 프레임의 픽셀의 대응점을 갖고 있는 motion map을 만든다. 이전 프레임의 feature map의 픽셀 값을 motion vector로 옯겨서 현재 시간의 feature map을 만든다. 그리고 현재 프레임에서도 feature map을 뽑아서 이 두 feature map을 합쳐서 사용한다. 이렇게 해서 현재 프레임에서는 잘 안보이는 부분에 대한 세그먼트 성공률을 올린다.
이전 프레임의 세그먼트 들이 현재 프레임의 세그먼트에서 트레킹 할 수 있도록 객체 ID로 관리한다.
현재 프레임에서의 세그멘테이션은 UPSNet을 사용함.
EfficientPS
EfficientNet 백본과 BiFPN으로 정확도화 속도를 잡은 모델
Image panoptic Segmentation vs Video panoptic segmentation
비디오가 세그먼트 색상이 유지되어서 스무스함. 세그먼트 id 트래킹 반영됨.
Panoptic Quality 평가
Segmentation Quality: 예측한 세그멘트가 GT와 잘 매치되는가: TP만 고려함
Recognition Quality: 같은 클래스인 여러 인스턴스를 잘 구분하는지를 Recall, Precition을 반영하여 평가
참고
proposal-free network
이미지 생성
VAE 류
VAE (2013, Variational Autoencode) - Autoencoder 기반 생성 모델, 확률적 샘플링을 통한 데이터 생성 가능
확률적 생성 모델의 일종. 입력 데이터를 latent space로 인코딩하고 이것을 x와 유사하지만 새로운 데이터를 생성
각 feature 는 가우시안 분포로 가정
latent z는 각 feature의 평균과 분산값을 나타냄
VAE vs AE
AE(AutoEncoder)의 목적은 Encoder. 입력 값을 가장 잘 나타내는 임베딩 Z를 만드는 Encoder를 학습. 이를 위해 Decoder를 활용
VAE의 목적은 Decoder. 입력값과 유사한 값을 잘 생성할 수 있는 Decoder를 학습. 이를 위해 Encoder를 붙인 것.
latent Vector의 비교
AE는 특정 입력 값에 대해 하나의 z값(임베딩)이 나옴
VAE는 특정 입력 값에 대해 가우시안분포에 기반한 확률 값이 나옴. 그래서 입력 값과 비슷하지만 다른 값이 출력됨.
VAE 장점
확률 모델 기반의 잠재 공간 학습
명확한 모델 평가 기준
임베딩을 다른 작업에 사용 가능
VAE 단점
낮은 품질: 생성된 결과물이 흐릿하거나 품질이 낮을 수 있음
VAE Latent Space 시각화
학습이 잘 되었는지, 의미 영역의 분포를 확인 가능
학습 잘 되었는지 확인
오토인코더에 비해 VAE가 더 넓게 원형태로 구역이 잘 나뉘어져 있음. 가우시안 분포
의미 영역 확인
MNIST 학습의 Latent 분포가 2차원이다. 여기서 지정한 위치의 latent에서 샘플을 얻어서 해당 영역에서 생성하는 숫자 이미지를 볼 수 있다.
beta를 1보다 크게 해서 p(z|x)의 분포 오차의 크기를 키운다. 그래서 p(z|x)가 원래 z의 분포인 p(z)의 분포에 더 가까워지게 한다.
학습한 인코더의 p(z|x)가 본래 z의 분포와 비슷할 수록 z가 자연스러운 상태일 가능성이 크다. z가 자연스러워야 디코더로 이미지를 생성했을 때 자연스럽게 잘 나온다. 본래의 z범위(분포)를 벗어나 있는 z는 이미지로 생성했을 때 합리적이지 않거나 흐릿하거나 무의미한 이미지가 나올 가능성이 크다.
이미지는 여러 객체들이 모인 것을 시각적으로 표현한 것인데 객체들 자체는 이산적이다. 예를 들어 개, 고양이는 이산적이다. 개10%+고양이90%인 것은 없다. 그래서 이산적인 객체 이미지의 임베딩 벡터 사전인 코드북을 인코더와 디코더 사이에 두고 이를 통해서 정보를 주고 받도록 한다. 인코더는 이미지가 이 벡터 코드북 사전의 어떤 벡터들로 구성되어 있는지 인덱스 맵에 명시하고, 디코더는 이 인덱스 맵을 참조해서 임베딩 코드북에서 해당 벡터를 가져와서 z를 재구성한 후 이미지를 생성한다.
벡터 양자화: 코드북 벡터는 인코더의 z와 제일 비슷하게 만드는 임베딩 벡터 e_j의 인덱스 k로 셋팅한다.
입력 이미지 -> z_p(x) -> k 맵 & 임베딩 코드북 -> z_q(x) -> 생성한 이미지
VQ-VAE2 (2019)
FPN 컨셉을 적용해서 코드북을 2 레벨로 구성함.
큰 크기로 벡터 k 맵을 만드는 bottom level 코드북, 더 작게 추상화 한 크기로 벡터 k 맵 만드는 top level 코드북
Pixel RNN (2016)
이전 픽셀 값으로 다음 픽셀 값을 예측해서 이미지를 생성하는 모델
픽셀 값을 256개의 이산 확률분포로 보고 RGB 각각 독립 확률 분포로 나타냄
3가지 픽셀 생성 방법을 제시함
Row LSTM
위의 픽셀들로 아래 픽셀을 예측함. 역삼각형 모양으로 아래 꼭지점 픽셀을 예측.
Diagonal BiLSTM
사각형에서 오른쪽 아래 픽셀을 예측함
PixelCNN
위의 두 방법 보다 계산량이 적은 CNN기반 방법도 제시
Image Transformer (2018)
Masked Self-attention 모델을 사용
픽셀 값을 이산 값으로 보고 이전의 픽셀 값들로 다음 픽셀 값을 예측함
GAN 류
GAN (Generative Adversarial Networks, 2014)
처음에는 판별자를 진짜와 가짜를 잘 구분하게 학습함(a->b). 판별자가 잘 판별하는 상태에서 생성자가 실제와 동일하게 생성을 해서 판별자가 원본/생성 판별 확률을 50%로 만듦
파란 점선: 판별 분포(1은 진짜, 0은 가짜)
녹색 선: 생성 데이터 분포
검은 점선: 원본 데이터 분포
판별자 D가 분류를 맞게 하면 value function V(D,G) = log1 + log 1 = 0
판별자 D가 진짜, 생성 중 하나라도 못 맞추면 -∞가 됨
장점
확률 모델 제시 하지 않아도 생성 학습 가능
데이터 레이블 없어도 됨
학습 데이터 증강에 활용 가능
단점
모드 붕괴 현상
판별자를 잘 속이는 생성잘 되는 것만 계속 생성하려는 경향이 생김
ex) minist면 0~9 모두 잘 생성해야 하는데 입력값 상관 없이 품질 좋은 0만 계속 생성 함.
판별자, 생성자의 성능 차이로 한 쪽으로 치우칠 수 있음
평가가 주관적이라 학습 종료 시점 잡기 애매함 -> 추후 inception scroe로 해결
inception score
엔트로피(무질서도) 높을 수록 무질서, 자연적, 낮을 수록 질서, 인공적임
클래스 분류 분포가 명확해서 분류 쉬워서 엔트로피는 낮으면서
전체 클래스에 골고루 잘 생성해서 생성 전체 분포는 평이해서 엔트로피가 높으면
inception score 높음
네트워크게 민감하여 수 많은 실험 필요
이미지가 커질 수록 학습 불안정
안정적 GAN 학습 방법
DCGAN(Deep Convolutional GAN) 사용
안정적 학습위한 표준 GAN 구조임
레이어 깊이, 필터 수
너무 깊으면 느리고 불안정함.
너무 적으면 표현력이 떨어짐
잔차 연결, 셀프 어텐션 활용
학습 안정성, 표현 향상
노이즈 추가
판별자에 가우시안 노이즈 추가해서 과적합 예방
배치 정규화
생성자와 판별자간 사용 위치를 다르게 적용
학습률(learning rate)
생성자, 판별자 학습 속도가 비슷하도록 조정
미니 배치 디스크리미네이션(Mini-batch Discrimination)
모드 붕괴 예방을 위해 판별자가 한 번에 1개 이미지가 아니라 미니 배치 단위로 판별을 함.
골고루 잘 생성해야 진짜라고 판별 하므로 생성자는 전체를 골고루 학습/생성함
스펙트럴 노멀라이제이션(Spectral Normalization)
판별자의 가중치 W에 대해 최대값을 1로 제한하는 정규화
판별자가 너무 강력해지면 학습 기울기가 0으로 수렴 또는 발산해서 생성자 학습이 안됨
학습 안정성 향상
DCGAN (2015)
fully connected layer대신 CNN을 활용하여 더 고해상도 이미지를 안정적으로 생성
Batch Normalization 적용으로 모드 붕괴 예방
CNN으로 작은 이미지도 잘 학습/표현
단순하면서도 성능 잘 나오는 구조
PROGAN (2018, Nvidia)
GAN은 최종 해상도 이미지를 다뤘다. PROGAN에서는 4x4 해상도 모델 학습부터 시작해서 1024 x 1024 해상도 모델로 키워간다.
생성자는 4x4 이미지를 생성하고 판별자는 이 생성이미지와 리얼 이미지로 진짜/가짜 판별을 한다.
생성자도 생성 이미지 해상도를 2배 키우고, 판별자도 판별 해상도를 2배 키운다.
1024 x 1024 해상도를 생성, 판별 할 때 까지 생성자/판별자 모델을 키운다.
모델을 키우는 중간 단계(b)에서 기존 모델의 비중(알파)을 조금씩 줄이고 새 모델(2배 해상도 모델)의 비중을 조금씩 늘려간다. 기존 모델의 비중이 0이 되면 기존 모델을 없애고 새 모델만 남긴다. 이렇게 2배 더큰 모델이 완성된다. 이 과정을 반복한다.
SAGAN (2019, Self-Attention GAN)
GAN의 layer 마다 CNN feature map마다 attention을 반영해서 self-attention feature map을 만든다. 원래 feature map과 self-attention feature map을 합친 후 다음 레이어로 보낸다.
f(x)는 key, g(x)는 query, h(x)는 value에 해당한다.
임의의 픽셀에 대해서 관련있는 부분에 attention heatmap이 생기는 것을 확인할 수 있다.
TransGAN (2021)
GAN에서 CNN대신 Transformer 사용.
256 x 256 이미지 생성이 한계. 이 크기에서는 StyleGAN 보다 성능 우수
생성기: 순수 Transformer 블록만 사용
판별기: ViT(Vision Transformer) 구조로 진짜/가짜 분류
Generative Pretraining from Pixels (2020)
GPT 처럼 다음 픽셀을 생성하기도하고(a), BERT 처럼 비어있는 픽셀을 채우기도함(b)
성능 평가 방법
학습한 모델 뒤에 분류기를 붙이고 분류 성능으로 모델 학습 수준을 평가함.(학습이 잘 되었다면 feature를 잘 뽑을 테니)
성능이 잘 나오지는 않았음
스타일 반영한 GAN 류
Neural Style Transfer (2016)
Gram Matrix
이미지의 스타일을 추출한 행렬 G.
Gram Matrix는이미지 feature의 단순 내적 행렬임
이 행렬이 이미지 전체적인 공통 정보를 담게 됨. 픽셀이 섞이면서 공간 정보는 없어지기 때문에 객체 정보는 없어짐. 이미지 정보에서 객체 정보가 빠지니까 스타일 정보만 남은 것임.
구체적으로는 H, W, C를 내적해서 CxC인 Gram Matrix가 나옴. H, W인 픽셀의 위치 정보는 섞여서 사라지고 채널 정보만 남음.
Neural Style Transfer
스타일 이미지에서 스타일 feature map을 뽑고, 원본 이미지에서 content feature map을 뽑은 후, 노이즈 이미지의 스타일 feature map, content feature map을 이들과 유사해지도록 노이즈 이미지를 변형함
스타일 input 이미지에서 conv layer마다 feature map으로 Gram matrix를 뽑는다. output 이미지(노이스에서 시작한 이미지)에서도 conv layer마다 feature map으로 Gram matrix를 뽑는다. 이 Gram matrix들 간의 차이가 Stye Loss이다.
원본 input 이미지에서는 conv4의 feature map과 output 이미지의 conv4의 feature map 간의 차이가 Content Loss이다.
Total Loss는 이 Content Loss와 Style Loss를 적당한 가중치로 더한 것이다.
이 Total Loss가 최소가 되는 gradient 방향으로 Output 이미지를 조금 변형한다.
위 과정을 반복하여 output 이미지를 완성한다.
StyleGAN (2018)
PROGAN 네트워크에 지정된 스타일을 입히는 방법을 제안.
(a) 기존 GAN은 latent z에서 바로 conv로 이미지를 생성한다.
(b) StyelGAN에서는 latent z를 맵핑 네트워크로 처리를 해서 w로 만든다. 매핑 네트워크의 각 레이어는 각각의 스타일을 갖고 있다( 낮은 레이어 스타일: 얼굴 포즈, 배경, 높은 레이어 스타일: 머리카락, 피부결, 색조 등). 이 스타일에 맵핑 처리한 결과인 w를 이미지 합성 네트워크(PROGAN 구조 모델)의 해상도별 생성 레이어에 AdaIN이라는 형태로 입력한다. (합성 네트워크에 최초 입력 값은 고정 상수 값으로 입력한다. Const 4X4X512 부분)
이렇게 스타일이 반영된 지정 해상도의 이미지가 생성되면 판별자가 리얼 이미지와 판별을 한다.
아래와 같이 스타일이 반영된 이미지가 생성된다. 사용자가 스타일을 지정해서 생성할 수는 없지만 스타일을 반영할 수 있다는 자체가 혁신이었다.
StyleGAN 2 (2020)
StyleGAN을 개선. 주로 StyleGAN 2를 씀.
개선1. StyleGAN에 얼룩을 제거. AdaIN을 개선해서 해결
개선 2. 머리가 다양한 방향으로 생성되었지만 치아는 정면으로만 생성되는 현상을 해결. PROGAN의 점진적 해상도 키우는 방법 때문임. 다양한 해상도로 생성할 수 있는 3가지 방법을 제안해서 해결함.
VQ-GAN (2021)
Transformer 기반으로 이미지 생성에서 SOTA 최초 달성, 고해상도 이미지 생성가능해짐.
VQ-VAE에서 임베딩 벡터 코드북과 벡터 인덱스 맵으로 디코더용 z_q를 만드는 대신에
VQ-GAN에서는 임베딩 벡터 코드북과 트랜스포머로 디코더용 z_q를 만든다.
VQ-VAE에서 인덱스 맵을 만드는 대신에 VQ-GAN에서는 트랜스포머가 바로 Z_q를 만든다.
Z_q를 만드는 방법은 벡터 인덱스 나열 s의 바로 다음에 올 s_i를 예측하는 것을 윈도우잉으로 반복한다.
VQ-GAN은 Transformer를 사용하기 때문에 큰 크기의 Z_q도 만들 수 있다. 그래서 다른 GAN에 비해 큰 해상도도 생성할 수 있다.
그리고 Transformer가 Z_q를 만들 때 입력 값에 컨디션도 같이 넣을 수 있어서 요구 스타일 조건도 같이 받을 수 있다. depth map, 세그멘테이션 맵, 키포인트, 이미지 클래스 등을 조건으로 입력할 수 있다.
컨디션을 주고 고해상도 이미지 생성한 결과
ViT-VQGAN (2022)
VQ-GAN에 ViT를 적용하고 classification으로 latent z가 정확하게 만들어 졌는지도 검증했음
이미지 입력으로 완전한 이미지 대신 ViT 처럼 조각낸 이미지를 입력해서 Transformer에 입력했다.
그리고 트랜스포머가 만든 Z_q를 입력 feature로 해서 classifiation 성능을 측정했다.
레이턴트 편집 류
GANspace (2020)
latent space에는 다양한 이미지 요소들이 반영되어 있고 latent z를 latent space에서 변경하면 스타일을 변경할 수 있다는 것을 확인함.
StyleGAN에는 Z latent space와 스타일 반영하는 매핑 네트워크를 통과한 결과 w의 공간인 W space가 있다. Z space에서 n개 데이터를 뽑아서 W space로 보낸다음 PCA한다.
여기서 주성분을 선택하거나 특정 주성분의 값을 변경하면 아래와 같이 성별, 얼굴 각도, 나이, 머리색을 변경할 수 있다. 위에서부터 행별로, 0번째 주성분을 변경한 결과, 1번째 주성분을 변경한 결과, 2번째 주성분을 변경한 결과, 0~2번째 주성분을 변경한 결과, 7~8번째 주성분을 변경한 결과 이미지이다.
SeFa (2021)
스타일 변경 요소를 체계화 했음
스타일 변경이라는 것은 latent z를 n 만큼 위치 이동한 것이라고 정의했다. 즉, z 벡터에 n벡터를 더하면 된다. 계산 편의를 위해 W space로 이동(Affine Trasnformation)하면 z는 Az+b 로 표현할 수 있고 n은 aAn으로 표현할 수 있다. 둘을 합하면 이동한, 변환한 w가 된다. 여기서 변화 시키는 부분이 aAn 부분이므로 |aAn|의 값이 가장 커지는 n이 변화를 위한 가장 큰 주성분으로 볼 수 있다. 이것을 기준으로 순차적으로 주성분을 뽑고 각 주성분을 조정하여 스타일 변경을 제어할 수 있다.
이 방식으로 각 주성분들을 조정해보니 아래 그림과 표 처럼 자세, 성별, 나이, 안경, 미소에 맞추어서 잘 변형되었다. 다른 스타일 항목에의 영향도 적고 변형 품질도 unsupervised임에도 supervised인 InterFaceGAN을 대체할 만큼 잘 나왔다.
그리고 StyleGAN의 합성 블록의 conv 레이어 블록의 레벨이 높을 수록 전체적/추상적인 특성이 변경됨을 확인했다. 큰 해상도인 bottom layer 블록에서는 자세, 방향이 변했고, middle layer 블록에서는 눈 크기, 확대, 형태가 변했고, 작은 해상도인 Top layer 블록에서는 페인트 스타일과 전반적인 색상등으로 변경되었다.
StyleSpace Anaysis (2021)
이전에는 StyleGAN의 W space에서 위치를 변경했다. StyelSpace Anaysis에서는 W space 다음에 S라는 스타일 변경 전용 space를 추가하자는 제안이다.
아래 그림에서 S공간 박스만 없으면 그대로 StyleGAN 구조이다. 저 S 공간을 추가하자는 이야기다.
이 S space를 분석, 변경하면 아래와 같이 세세한 변경을 할 수 있다. 머리카락, 자동차 그릴, 범퍼, 헤드라이트 등
이전 단계에다 노이즈를 조금씩 더 추가함. q(X_t|X_(t-1))은 X_(t-1)에 노이즈를 추가해서 X_t를 만든다. 노이즈는 베타 만큼의 크기를 갖는 가우시안 노이즈다. 베타는 요즘은 cosine을 쓴다.
노이즈 포함한 이전 단계에서 가우시 노이즈를 조금 걷어내는 확률 p를 학습. 여기서도 노이즈는 베타 크기의 가우시안 노이즈이다. 인퍼런스 때는 노이즈 상태인 X_T에서 시작하므로 적용된 노이즈의 분포를 모르므로 평균과 분산을 추정해나간다.
노이즈 베타 값을 cosine쓰는 이유는 아래와 같이 linear하게 증가하게 할 때 보다 노이즈가 더 점진적으로 추가 되어 더 안정적이다. linear하게 적용하면 노이즈가 급하게 추가되어서 중간 이후부터는 X_t가 완전 노이즈가 되어버려서 복원하기 힘들게 된다.
스텝수를 1000번 이상으로 늘릴 수록 품질이 좋다. 그런데 현실적으로 스텝을 1000번이나 하기에는 너무 오래 걸리므로 DDPM(빨간색)을 쓰면 초반부터 적절한 품질을 얻을 수 있다.
생성 제어
스텝 마다 이미지를 예측해서 그만큼 노이즈를 제거하는 것 보다, 노이즈를 예측해서 해당 노이즈를 제거하는 것이 더 학습 안정성이 높음. 그래서 학습, 제어 모두 노이즈인 엡쉴론을 대상으로 함.
Conditional Training
잘 안씀.
수식에 컨디션 c를 직접 넣음. 불안정함.
Classifier Guidance
잘 안 씀.
학습된 classifier의 결과로 가이드 함.
noise map에 특정 클래스 객체에 대한 gradient를 추가하는 방식. 특정 클래스(개, 고양이, ..) 객체가 두드러지게 생성
Classsifier-Free Guidance(CFG)
가장 많이 쓰임
프롬프트의 강도를 설정
프롬프트가 이미지 생성의 조건 c이다. 이 조건의 강도를 설정하는 것이 CFG이고 w값이다.
노이즈 생성식은 프롬프트 반영한 노이즈에 프롬프트 반영 안한 노이즈를 뺀 결과 값이다.
위 식을 다시 정리하면 프롬프트 반영한 노이즈를 기본으로 하고, 여기에다 '프롬프트 반영한 노이즈와 프롬프트 없는 노이즈의 차이'를 w만큼 추가한다. 여기서 w가 CFG값으로 기본적으로 프롬프트를 얼마나 더 강하게 반영할지에 대한 값이다.
w = 0. 프롬프트 기본 반영해서 그림
w = 2~7 프롬프트 반영 강함(CFG 기본 값: 7~8
w > 10 프롬프트 매우 강하게 반영
Direct Injection of Condition
잘 안씀.
샘플링 과정(이미지 생성 과정)에서 원하는 이미지 방향으로 계속 이끄는 방식.
노이즈의 영향으로 원하지 않는 방향으로 가기도 함.
스텝 중간에 레퍼런스 이미지의 structure를 직접 추가함.
(Multimodal) Prompt Guidance
많이 씀
프롬프트로 임베딩하는 추가 모듈 존재
기존 Denoising 모델(UNet)에 zero convolution, cross-attention, FiLM 등으로 입력
Text Guidance(에디팅 특화)
많이 씀
생성한 이미지를 수정 생성. DDPM 중간으로 다시 보내서 생성.
효율 개선
DDIM (Denoising Diffusion Implicit Models, 2021)
DDPM(Denoising Diffusion Probabilistic Models)의 역과정은 t, t-1, t-2로 순차적으로 1000 단계를 모두 처리하려다보니 너무 느리다. 순차 처리라 GPU로 병렬 처리도 안됨.
DDIM은 t에서 바로 원하는 t-i로 바로 가기 때문에 시간이 확 줄어든다.
아래 그림에서 DDPM은 왼쪽 처럼 x_2가 x_1을 전제로 한다. DDIM은 오른쪽 처럼 x_2는 x_1뿐만 아니라 x_0도 조건으로 갖고 있다고 전제한다.
그러면 x_t 에서 x_0을 구한 다음 x_t와 x_0로 x_i를 바로 구할 수 있다.
x_(t_1), x_0를 조건으로 x_t 를 구하는 아래 식을 전개하면
아래와 같이 도출할 수 있다. 여기서 시그마가 0이 아니면 DDPM고 0이면 DDIM이 된다.
그리고 x_0, x_t 모두 가우시안 분포임을 이용하면 x_0의 예상값은 아래와 같이 된다. 그래서 위 식에서 시그마를 0으로 놓고 아래 x_0 예측값을 적용하면
임의의 s인 x_s를 아래와 같이 정리할 수 있다.
이제 x_0 예측값과 현재 값인 x_t 를 알고 있으니 임의의 s에 대한 x_s값을 바로 계산해 낼 수 있다.
이 식을 이용해서 DDPM의 1000개 스텝을 모두 밟지 않고 여러 스텝을 건너 뛰어가면서 x_s값을 구하면 몇 개 스텝만으로 이미지를 생성할 수 있다.
이 때의 품질을 보면(아래 표에서 n이 1이 DDPM, 0이 DDIM이다. 숫자가 작을 수록 우수 품질. DDIM은 50스텝 만에 DDPM 1000스텝을 뛰어 넘었다.
Progressive distillation (Progressive distillation for fast sampling of diffusion models, 2022)
DDIM을 교사로해서 학생을 학습해서 4 스텝만에 DDIM 100스텝 성능을 초과함
DDIM의 한 스텝 식은 아래와 같다.
교사(DDIM) 2 스텝한 결과를 학생 1스텝의 값이 되도록 하면 아래와 같다.
이렇게 교사의 스텝을 1/2씩 줄여서 학습하는 것을 반복해서 스텝수를 계속 줄였다.
학습 절차는 아래와 같다.
문제점
증류 학습 특성상 낮은 SNR(Signal to Noise Ratio) 대역을 자주 다루게 됨.
낮은 SNR은 신호 항보다 노이즈 항값이 크기 때문에 x_s 값이 불안정해서 학습이 불안정해진다.
개선은 했으나 해결은 안됨.
Consistency Model (2023)
1~4 스텝만으로 diffusion 모델 동작 완료
Probability Flow ODE(Ordinary Differential Equation)(확률 흐름 미분방정식)가 주어 졌을 때 모든 샘플(x_t, t)에서 원본(x_0, 0)로 한번에 복원할 수 있는 f()를 학습한다. distillation(증류) 학습 법과 Isolation(독립적) 학습법을 제시했다.
Consistency distillation
x_t를 이용해서 PF-ODE 경로를 학습하고, 이 경로내의 모든 x_t에 대해 x_0로 바로 가는 consistency function을 학습한다.
활용 분야
super-resolution
Video generation
Video Diffusion Models (2022)
3D U-Net으로 16프레임 video 생성
Imagen Video
텍스트로 비디오 생성. cascade 방식으로 작고 짧은 비디오를 길고 크게 늘림
텍스트 프롬프트로 16 프레임 40X23 해상도, 3 fps 비디오를 생성한 후 단계 마다 시간과 해상도를 늘려서 128 프레임, 1280X768 해상도, 24 fps까지 늘림
프레임 사이의 시간 종속성을 학습/생성하기 위해 spatial attention, spatial conv 들을 temporal attention, temporal conv layer로 연결한 3D U-Net을 적용했다.
비디오에서의 해결 과제
시간이 흘러도 ID 유지: 몇 초 지나면 다른 사람으로 바뀜
시간 상 일관성 유지하고 더 긴 비디오 생성 가능해야함. diffusion model은 spatial data에 특화 되어 있음.
Text to Video 한계: 글로 비디오를 다 묘사하기는 어려움
VTO(Virtual Try-on, 사용자가 가상공간에서 상품을 착용해봄)
Diffuse To Choose (DTC, 2024)
사용자 이미지(Source)를 입력 받고 옷 부분을 마스킹해서 삭제한다. 마스킹 한 부분에 상품 크기 조정한 이미지를 덧붙이고 U-Net으로 인코딩한다. 이것을 이미지 생성 U-Net 디코터의 각 레이어에 affine transform해서 넣어주면 상품 이미지를 입은 사용자 이미지가 생성된다.
여기서 VAE 인코더 사용한 것은 입력 이미지를 레이턴트 스페이스로 변환해서 차원 축소를 한다.
생성 예
편집 기법 - Paint by Example (2023)
원본 이미지에 마스킹하고 프롬프트와 레퍼런스 이미지를 입력하면 합성 이미지를 생성한다.
학습 방식
원본 이미지에서 crop한 부분을 마스킹을 한후 diffusion model에 넣는다. 그리고 crop한 이미지는 증강한 다음 CLIP을 통해 클래스 명 임베딩을 뽑는다. 이 클래스명 임베딩을 diffusion model에 프롬프트 C로 추가해서 이미지를 생성한다.
3D 생성
시멘틱 세그멘테이션
오디오 생성
이미지 편집
의료 영상 생성
IMAGEN (2022)
실사 이미지 생성, 언어 이해도 높은 텍스트 임베딩 생성
T5로 텍스트 임베딩 생성 -> 64 x 64 이미지 생성 -> Super Resolution Diffusion 2개로 1024 x 1024 이미지 생성
실사 이미지 생성
DALL-E2보다 언어 이해도 높음
Stable Diffusion (Latent Diffusion Models, 2021)
특징
latent 공간 상에서 이미지 임베딩을 생성해서 낮은 스펙에서 고해상도 이미지 생성 가능
다양한 입력 조건 설정 가능
무료 공개
Pixel Space
이미지 입력 -> VAE 인코더 -> 이미지 임베딩 z 출력
학습 시: 원본 이미지, 512 x 512
생성 시: 사용 안함.
이미지 임베딩 -> VAE 디코더 -> 생성 이미지, 512 x 512
Latent Space
Diffusion Process
이미지 임베딩 z에 노이즈를 추가해서 z_T를 만듦(Diffusion 프로세스 중 노이즈 추가 과정)
Denoising U-Net
노이즈가 추가된 Z_T에 조건 임베딩 T를 추가해서 노이즈가 제거된 이미지 임베딩 Z_(T-1)을 생성함.
Cross-Attention으로 중간 단계의 이미지 임베딩과 조건 임베딩을 합쳐서 처리함.
학습 때는 Diffusion Process -> Denoising U-Net
생성 때는 노이즈 포함된 Z_T를 입력으로해서 Denoising U-Net에서 시작함
Conditioning
텍스트 프롬프트, 시멘틱 맵, 참조 이미지, 스켈레톤 등을 입력 받아서 조건 임베딩을 만든다
ControlNet (2023)
Stable Diffusion에 ControlNet 부분을 붙여서 쓴다.
Stable Diffusion은 원래 U-Net 그대로 쓴다. ControlNet 부분은 Stable Diffusion의 U-Net을 copy해 온거다. ControlNet U-Net 인코딩 부분에서 조건 입력의 임베딩을 뽑는다. 이것을 Stable Diffusion U-Net의 디코딩 블록 마다 추가 입력으로 넣는다. 그러면 Stable Diffusion의 U-Net의 디코딩 부분은 원래 생성 하려던 이미지 임베딩에다가 추가로 받은 조건 임베딩를 합쳐서 둘 다 반영된 이미지를 생성하게 된다.
ControlNet의 U-Net의 인코딩 부분은 Stable Diffusion U-Net의 상태 그대로에서 학습을 시작하고, 디코딩 부분은 Zero Convolution(W를 0으로 셋팅)으로 셋팅한 상태에서 학습을 시작한다. 디코딩 부분은 이코딩한 임베딩을 전달하는 역할을 하는데 ControlNet의 임베딩을 0만큼 반영하는 것에서 부터 시작해서 조금씩 늘려가는 형태로 학습을 하는 가중치 조절하는 통로 역할을 한다.
그리고 ControlNet은 Stable Diffusion U-Net 입력인 가우시안 노이즈 이미지 와 조건 입력의 zero convolution(W를 0으로 셋팅)한 결과의 합을 입력값으로 받는다.
T2I-Adapter (2023)
ControlNet과 같은 시기에 같은 컨셉과 목적으로 나온 모델
조건 입력용 인코더(노란색 불)가 조건 임베딩을 만들어서 Stable Diffusion U-Net의 인코딩 블록과 Denoising U-Net의 인코딩 블록에 추가로 넣어서 임베딩을 만들 때 조건을 반영하도록 한다. ControlNet은 디코딩 파트에 넣는데 이건 반대다.
ControlNet이 모델이 더 커서 생성 품질이 더 좋음. 그래서 ControlNet을 더 많이 씀.
IP-Adapter (2023)
Stable Diffusion의 문제점: 기존의 텍스트 조건을 입력하는 Cross attention을 그대로 사용하고 있기 때문에 이미지 형태의 조건은 완전하게 반영이 안된다.
그래서 IP-Adapter에서는 기존 텍스트용 Cross-Attention 외에 이미지용 Cross Attention을 추가했다. 아래 붉은 색 부분. U-Net의 각 블록에서는 이미지용 Cross-Attention의 결과와 기존 텍스트용 Cross Attention의 결과를 합쳐서 처리한다.
그래서 이미지형태의 조건을 더 잘 반영한 생성 이미지를 얻을 수 있다.
LLAVA-MoLE (Mixture of LoRA Experts, 2024)
하나의 MLLM 모델에 다양한 모달 종류의 데이터로 학습 시키는 것은 데이터간 충돌이나 학습 반영 정도가 달라서 학습 시키기가 어렵다.
LAVA-MoLE의 아이디어는 입력 종류별로 각각의 LoRA를 학습 시키고 입력 데이터 종류에 따라 Router가 해당 LoRA를 선택해서 사용한다는 아이디어다. LoRA가 각 입력 종류 별 Expert이다.
ControlNet + LoRA
구조는 ControlNet으로 설정하고 스타일은 LoRA로 반영하는 식으로 활용
ImageBind (2023)
다양한 종류의 데이터를 self-supervised learning으로 하나의 임베딩 공간에 반영했다. 다른 종류라도 관련이 높은 데이터의 임베딩이 가까운 곳에 위치함
캡션이 있는 이미지로 이미지와 텍스트를 학습. 이미지와 텍스트 간의 관계가 자연스럽게 정렬됨(Naturally Aligned. 아래 그림 실선)
이미지와 뎁스맵의 관계를 학습, 비디오 영상과 소리를 학습, 이미지와 온도이미지를 학습, 비디오와 관성(IMU)를 학습했다.
그랬더니 직접 같이 학습하지 않은 관계(텍스트와 소리, 텍스트와 비디오, ...)에 대해서도 관계성이 정렬되어 있게 되었다(Emergent Alignment. 스스로 생겨난 정렬. 그림의 점선)
이 임베딩을 이용하면,
검색: 이미지와 소리로 관련 이미지를 검색
객체 인식: 아래 그림과 소리로 이미지에서 객체 인식
멀티 모달 이슈
멀티 모달 데이터 부족
멀티 모달 데이터 정렬과 다양한 제어 기술을 적용하니 복잡해지고 이슈 많아짐. 이를 위한 모델 설계와 학습 알고리즘 연구
모델 편향성: 편향된 이미지 생성
Explainable AI: 설명 안됨
인간의 일반 능력, 창의력 반영 필요
할루시네이션
XAI (Explainable AI)
AI 모델 학습 및 평가 (Learning curve 해석/검증, 평가지표의 설계)
AI모델 튜닝 (HPO(Hyper-Parameter Optimization), Class Imbalanced 해결)